diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index bf0b650faa35e6..8c0087734da465 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -379,6 +379,13 @@ jobs: fail_ci_if_error: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + - name: Upload test results to Codecov + if: github.ref == 'refs/heads/master' && github.event_name == 'push' && github.repository == 'argoproj/argo-cd' + uses: codecov/test-results-action@1b5b448b98e58ba90d1a1a1d9fcb72ca2263be46 # v1.0.0 + with: + file: test-results/junit.xml + fail_ci_if_error: true + token: ${{ secrets.CODECOV_TOKEN }} - name: Perform static code analysis using SonarCloud env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index a246b335633606..f53bfb38fdc4d6 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -397,8 +397,21 @@ func (r *ApplicationSetReconciler) setApplicationSetStatusCondition(ctx context. paramtersGeneratedCondition := getParametersGeneratedCondition(paramtersGenerated, condition.Message) resourceUpToDateCondition := getResourceUpToDateCondition(errOccurred, condition.Message, condition.Reason) + evaluatedTypes := map[argov1alpha1.ApplicationSetConditionType]bool{ + argov1alpha1.ApplicationSetConditionErrorOccurred: true, + argov1alpha1.ApplicationSetConditionParametersGenerated: true, + argov1alpha1.ApplicationSetConditionResourcesUpToDate: true, + } newConditions := []argov1alpha1.ApplicationSetCondition{errOccurredCondition, paramtersGeneratedCondition, resourceUpToDateCondition} + if progressiveSyncsRollingSyncStrategyEnabled(applicationSet) { + evaluatedTypes[argov1alpha1.ApplicationSetConditionRolloutProgressing] = true + + if condition.Type == argov1alpha1.ApplicationSetConditionRolloutProgressing { + newConditions = append(newConditions, condition) + } + } + needToUpdateConditions := false for _, condition := range newConditions { // do nothing if appset already has same condition @@ -409,13 +422,8 @@ func (r *ApplicationSetReconciler) setApplicationSetStatusCondition(ctx context. } } } - evaluatedTypes := map[argov1alpha1.ApplicationSetConditionType]bool{ - argov1alpha1.ApplicationSetConditionErrorOccurred: true, - argov1alpha1.ApplicationSetConditionParametersGenerated: true, - argov1alpha1.ApplicationSetConditionResourcesUpToDate: true, - } - if needToUpdateConditions || len(applicationSet.Status.Conditions) < 3 { + if needToUpdateConditions || len(applicationSet.Status.Conditions) < len(newConditions) { // fetch updated Application Set object before updating it namespacedName := types.NamespacedName{Namespace: applicationSet.Namespace, Name: applicationSet.Name} if err := r.Get(ctx, namespacedName, applicationSet); err != nil { @@ -1220,7 +1228,7 @@ func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatusConditio Message: "ApplicationSet Rollout Rollout started", Reason: argov1alpha1.ApplicationSetReasonApplicationSetModified, Status: argov1alpha1.ApplicationSetConditionStatusTrue, - }, false, + }, true, ) } else if !appSetProgressing && appSetConditionProgressing { _ = r.setApplicationSetStatusCondition(ctx, @@ -1230,7 +1238,7 @@ func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatusConditio Message: "ApplicationSet Rollout Rollout complete", Reason: argov1alpha1.ApplicationSetReasonApplicationSetRolloutComplete, Status: argov1alpha1.ApplicationSetConditionStatusFalse, - }, false, + }, true, ) } diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index dba734c8410b58..9a61006a4461d5 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -2266,54 +2266,179 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { err = v1alpha1.AddToScheme(scheme) require.NoError(t, err) - appSet := v1alpha1.ApplicationSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "name", - Namespace: "argocd", + testCases := []struct { + appset v1alpha1.ApplicationSet + conditions []v1alpha1.ApplicationSetCondition + testfunc func(t *testing.T, appset v1alpha1.ApplicationSet) + }{ + { + appset: v1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "argocd", + }, + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{ + {List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }}, + }, + Template: v1alpha1.ApplicationSetTemplate{}, + }, + }, + conditions: []v1alpha1.ApplicationSetCondition{ + { + Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, + Message: "All applications have been generated successfully", + Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, + Status: v1alpha1.ApplicationSetConditionStatusTrue, + }, + }, + testfunc: func(t *testing.T, appset v1alpha1.ApplicationSet) { + assert.Len(t, appset.Status.Conditions, 3) + }, }, - Spec: v1alpha1.ApplicationSetSpec{ - Generators: []v1alpha1.ApplicationSetGenerator{ - {List: &v1alpha1.ListGenerator{ - Elements: []apiextensionsv1.JSON{{ - Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), - }}, - }}, + { + appset: v1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "argocd", + }, + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{ + {List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }}, + }, + Template: v1alpha1.ApplicationSetTemplate{}, + }, + }, + conditions: []v1alpha1.ApplicationSetCondition{ + { + Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, + Message: "All applications have been generated successfully", + Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, + Status: v1alpha1.ApplicationSetConditionStatusTrue, + }, + { + Type: v1alpha1.ApplicationSetConditionRolloutProgressing, + Message: "ApplicationSet Rollout Rollout started", + Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, + Status: v1alpha1.ApplicationSetConditionStatusTrue, + }, + }, + testfunc: func(t *testing.T, appset v1alpha1.ApplicationSet) { + assert.Len(t, appset.Status.Conditions, 3) + + isProgressingCondition := false + + for _, condition := range appset.Status.Conditions { + if condition.Type == v1alpha1.ApplicationSetConditionRolloutProgressing { + isProgressingCondition = true + break + } + } + + assert.False(t, isProgressingCondition, "no RolloutProgressing should be set for applicationsets that don't have rolling strategy") }, - Template: v1alpha1.ApplicationSetTemplate{}, }, - } + { + appset: v1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "argocd", + }, + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{ + {List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }}, + }, + Template: v1alpha1.ApplicationSetTemplate{}, + Strategy: &v1alpha1.ApplicationSetStrategy{ + Type: "RollingSync", + RollingSync: &v1alpha1.ApplicationSetRolloutStrategy{ + Steps: []v1alpha1.ApplicationSetRolloutStep{ + { + MatchExpressions: []v1alpha1.ApplicationMatchExpression{ + { + Key: "test", + Operator: "In", + Values: []string{"test"}, + }, + }, + }, + }, + }, + }, + }, + }, + conditions: []v1alpha1.ApplicationSetCondition{ + { + Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, + Message: "All applications have been generated successfully", + Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, + Status: v1alpha1.ApplicationSetConditionStatusTrue, + }, + { + Type: v1alpha1.ApplicationSetConditionRolloutProgressing, + Message: "ApplicationSet Rollout Rollout started", + Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, + Status: v1alpha1.ApplicationSetConditionStatusTrue, + }, + }, + testfunc: func(t *testing.T, appset v1alpha1.ApplicationSet) { + assert.Len(t, appset.Status.Conditions, 4) + + isProgressingCondition := false + + for _, condition := range appset.Status.Conditions { + if condition.Type == v1alpha1.ApplicationSetConditionRolloutProgressing { + isProgressingCondition = true + break + } + } - appCondition := v1alpha1.ApplicationSetCondition{ - Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, - Message: "All applications have been generated successfully", - Reason: v1alpha1.ApplicationSetReasonApplicationSetUpToDate, - Status: v1alpha1.ApplicationSetConditionStatusTrue, + assert.True(t, isProgressingCondition, "RolloutProgressing should be set for rollout strategy appset") + }, + }, } kubeclientset := kubefake.NewSimpleClientset([]runtime.Object{}...) argoDBMock := dbmocks.ArgoDB{} argoObjs := []runtime.Object{} - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).WithIndex(&v1alpha1.Application{}, ".metadata.controller", appControllerIndexer).Build() + for _, testCase := range testCases { + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&testCase.appset).WithIndex(&v1alpha1.Application{}, ".metadata.controller", appControllerIndexer).Build() - r := ApplicationSetReconciler{ - Client: client, - Scheme: scheme, - Renderer: &utils.Render{}, - Recorder: record.NewFakeRecorder(1), - Cache: &fakeCache{}, - Generators: map[string]generators.Generator{ - "List": generators.NewListGenerator(), - }, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - } + r := ApplicationSetReconciler{ + Client: client, + Scheme: scheme, + Renderer: &utils.Render{}, + Recorder: record.NewFakeRecorder(1), + Cache: &fakeCache{}, + Generators: map[string]generators.Generator{ + "List": generators.NewListGenerator(), + }, + ArgoDB: &argoDBMock, + ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), + KubeClientset: kubeclientset, + } - err = r.setApplicationSetStatusCondition(context.TODO(), &appSet, appCondition, true) - require.NoError(t, err) + for _, condition := range testCase.conditions { + err = r.setApplicationSetStatusCondition(context.TODO(), &testCase.appset, condition, true) + require.NoError(t, err) + } - assert.Len(t, appSet.Status.Conditions, 3) + testCase.testfunc(t, testCase.appset) + // assert.Len(t, testCase.appset.Status.Conditions, 3) + } } func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.Application { diff --git a/assets/swagger.json b/assets/swagger.json index 52cb3cdccde9ad..4d0cc0976601e7 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -8179,6 +8179,10 @@ "type": "string", "title": "GithubAppPrivateKey specifies the private key PEM data for authentication via GitHub app" }, + "noProxy": { + "type": "string", + "title": "NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied" + }, "password": { "type": "string", "title": "Password for authenticating at the repo server" @@ -8285,6 +8289,10 @@ "type": "string", "title": "Name specifies a name to be used for this repo. Only used with Helm repos" }, + "noProxy": { + "type": "string", + "title": "NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied" + }, "password": { "type": "string", "title": "Password contains the password or PAT used for authenticating at the remote repository" diff --git a/cmd/argocd-dex/commands/argocd_dex.go b/cmd/argocd-dex/commands/argocd_dex.go index 55b628ba96dc1e..43efbbb050dd5b 100644 --- a/cmd/argocd-dex/commands/argocd_dex.go +++ b/cmd/argocd-dex/commands/argocd_dex.go @@ -136,8 +136,8 @@ func NewRunDexCommand() *cobra.Command { } clientConfig = cli.AddKubectlFlagsToCmd(&command) - command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_DEX_SERVER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_DEX_SERVER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") command.Flags().BoolVar(&disableTLS, "disable-tls", env.ParseBoolFromEnv("ARGOCD_DEX_SERVER_DISABLE_TLS", false), "Disable TLS on the HTTP endpoint") return &command } @@ -204,8 +204,8 @@ func NewGenDexConfigCommand() *cobra.Command { } clientConfig = cli.AddKubectlFlagsToCmd(&command) - command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_DEX_SERVER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_DEX_SERVER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") command.Flags().StringVarP(&out, "out", "o", "", "Output to the specified file instead of stdout") command.Flags().BoolVar(&disableTLS, "disable-tls", env.ParseBoolFromEnv("ARGOCD_DEX_SERVER_DISABLE_TLS", false), "Disable TLS on the HTTP endpoint") return &command diff --git a/cmd/argocd/commands/repo.go b/cmd/argocd/commands/repo.go index 35b1aebb04bf8b..f58204ea76c3a1 100644 --- a/cmd/argocd/commands/repo.go +++ b/cmd/argocd/commands/repo.go @@ -178,6 +178,7 @@ func NewRepoAddCommand(clientOpts *argocdclient.ClientOptions) *cobra.Command { repoOpts.Repo.GithubAppInstallationId = repoOpts.GithubAppInstallationId repoOpts.Repo.GitHubAppEnterpriseBaseURL = repoOpts.GitHubAppEnterpriseBaseURL repoOpts.Repo.Proxy = repoOpts.Proxy + repoOpts.Repo.NoProxy = repoOpts.NoProxy repoOpts.Repo.ForceHttpBasicAuth = repoOpts.ForceHttpBasicAuth if repoOpts.Repo.Type == "helm" && repoOpts.Repo.Name == "" { diff --git a/cmd/util/repo.go b/cmd/util/repo.go index b60c30a071311f..6b822c6309f703 100644 --- a/cmd/util/repo.go +++ b/cmd/util/repo.go @@ -22,6 +22,7 @@ type RepoOptions struct { GithubAppPrivateKeyPath string GitHubAppEnterpriseBaseURL string Proxy string + NoProxy string GCPServiceAccountKeyPath string ForceHttpBasicAuth bool } @@ -44,6 +45,7 @@ func AddRepoFlags(command *cobra.Command, opts *RepoOptions) { command.Flags().StringVar(&opts.GithubAppPrivateKeyPath, "github-app-private-key-path", "", "private key of the GitHub Application") command.Flags().StringVar(&opts.GitHubAppEnterpriseBaseURL, "github-app-enterprise-base-url", "", "base url to use when using GitHub Enterprise (e.g. https://ghe.example.com/api/v3") command.Flags().StringVar(&opts.Proxy, "proxy", "", "use proxy to access repository") + command.Flags().StringVar(&opts.Proxy, "no-proxy", "", "don't access these targets via proxy") command.Flags().StringVar(&opts.GCPServiceAccountKeyPath, "gcp-service-account-key-path", "", "service account key for the Google Cloud Platform") command.Flags().BoolVar(&opts.ForceHttpBasicAuth, "force-http-basic-auth", false, "whether to force use of basic auth when connecting repository via HTTP") } diff --git a/docs/assets/versions.js b/docs/assets/versions.js index 274b3b557eae6a..b9f0b13e8d0135 100644 --- a/docs/assets/versions.js +++ b/docs/assets/versions.js @@ -61,23 +61,17 @@ window.addEventListener("DOMContentLoaded", function() { var margin = 30; var headerHeight = document.getElementsByClassName("md-header")[0].offsetHeight; const currentVersion = getCurrentVersion(); - if (currentVersion) { + if (currentVersion && currentVersion !== "stable") { if (currentVersion === "latest") { document.querySelector("div[data-md-component=announce]").innerHTML = "
You are viewing the docs for an unreleased version of Argo CD, click here to go to the latest stable version.
"; - var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; - document.querySelector("header.md-header").style.top = bannerHeight + "px"; - document.querySelector('style').textContent += - "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; - document.querySelector('style').textContent += - "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; - } else if (currentVersion !== "stable") { + } else { document.querySelector("div[data-md-component=announce]").innerHTML = "
You are viewing the docs for a previous version of Argo CD, click here to go to the latest stable version.
"; - var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; - document.querySelector("header.md-header").style.top = bannerHeight + "px"; - document.querySelector('style').textContent += - "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; - document.querySelector('style').textContent += - "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; } + var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; + document.querySelector("header.md-header").style.top = bannerHeight + "px"; + document.querySelector('style').textContent += + "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + document.querySelector('style').textContent += + "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; } }); diff --git a/docs/operator-manual/argocd-cmd-params-cm.yaml b/docs/operator-manual/argocd-cmd-params-cm.yaml index 80fc27b9ad7f23..8b5e18a5fa6ef0 100644 --- a/docs/operator-manual/argocd-cmd-params-cm.yaml +++ b/docs/operator-manual/argocd-cmd-params-cm.yaml @@ -188,6 +188,11 @@ data: # Include hidden directories from Git reposerver.include.hidden.directories: "false" + + # Set the logging format. One of: text|json (default "text") + dexserver.log.format: "text" + # Set the logging level. One of: debug|info|warn|error (default "info") + dexserver.log.level: "info" # Disable TLS on the HTTP endpoint dexserver.disable.tls: "false" diff --git a/docs/operator-manual/declarative-setup.md b/docs/operator-manual/declarative-setup.md index 324e6dc74620bd..d2e24ef71f2b55 100644 --- a/docs/operator-manual/declarative-setup.md +++ b/docs/operator-manual/declarative-setup.md @@ -468,9 +468,9 @@ data: ### Configure repositories with proxy -Proxy for your repository can be specified in the `proxy` field of the repository secret, along with other repository configurations. Argo CD uses this proxy to access the repository. Argo CD looks for the standard proxy environment variables in the repository server if the custom proxy is absent. +Proxy for your repository can be specified in the `proxy` field of the repository secret, along with a corresponding `noProxy` config. Argo CD uses this proxy/noProxy config to access the repository and do related helm/kustomize operations. Argo CD looks for the standard proxy environment variables in the repository server if the custom proxy config is absent. -An example repository with proxy: +An example repository with proxy and noProxy: ```yaml apiVersion: v1 @@ -484,10 +484,13 @@ stringData: type: git url: https://github.com/argoproj/private-repo proxy: https://proxy-server-url:8888 + noProxy: ".internal.example.com,company.org,10.123.0.0/16" password: my-password username: my-username ``` +A note on noProxy: Argo CD uses exec to interact with different tools such as helm and kustomize. Not all of these tools support the same noProxy syntax as the [httpproxy go package](https://cs.opensource.google/go/x/net/+/internal-branch.go1.21-vendor:http/httpproxy/proxy.go;l=38-50) does. In case you run in trouble with noProxy not beeing respected you might want to try using the full domain instead of a wildcard pattern or IP range to find a common syntax that all tools support. + ### Legacy behaviour In Argo CD version 2.0 and earlier, repositories were stored as part of the `argocd-cm` config map. For diff --git a/docs/operator-manual/upgrading/2.12-2.13.md b/docs/operator-manual/upgrading/2.12-2.13.md index a632d019c3faa8..c98845f9e59279 100644 --- a/docs/operator-manual/upgrading/2.12-2.13.md +++ b/docs/operator-manual/upgrading/2.12-2.13.md @@ -64,3 +64,6 @@ The default extension for log files generated by Argo CD when using the "Downloa - Consistency with standard log file conventions. If you have any custom scripts or tools that depend on the `.txt` extension, please update them accordingly. +## Added proxy to kustomize + +Proxy config set on repository credentials / repository templates is now passed down to the `kustomie build` command. diff --git a/docs/user-guide/commands/argocd_admin_repo_generate-spec.md b/docs/user-guide/commands/argocd_admin_repo_generate-spec.md index 5dfdf50881dcdb..b25d3d035940fc 100644 --- a/docs/user-guide/commands/argocd_admin_repo_generate-spec.md +++ b/docs/user-guide/commands/argocd_admin_repo_generate-spec.md @@ -50,6 +50,7 @@ argocd admin repo generate-spec REPOURL [flags] --insecure-ignore-host-key disables SSH strict host key checking (deprecated, use --insecure-skip-server-verification instead) --insecure-skip-server-verification disables server certificate and host key checks --name string name of the repository, mandatory for repositories of type helm + --no-proxy string don't access these targets via proxy -o, --output string Output format. One of: json|yaml (default "yaml") --password string password to the repository --project string project of the repository diff --git a/docs/user-guide/commands/argocd_repo_add.md b/docs/user-guide/commands/argocd_repo_add.md index 52f09b553f03b0..a6516d02329e0a 100644 --- a/docs/user-guide/commands/argocd_repo_add.md +++ b/docs/user-guide/commands/argocd_repo_add.md @@ -64,6 +64,7 @@ argocd repo add REPOURL [flags] --insecure-ignore-host-key disables SSH strict host key checking (deprecated, use --insecure-skip-server-verification instead) --insecure-skip-server-verification disables server certificate and host key checks --name string name of the repository, mandatory for repositories of type helm + --no-proxy string don't access these targets via proxy --password string password to the repository --project string project of the repository --proxy string use proxy to access repository diff --git a/docs/user-guide/multiple_sources.md b/docs/user-guide/multiple_sources.md index 462bfa13475f38..f9be46d76f8faf 100644 --- a/docs/user-guide/multiple_sources.md +++ b/docs/user-guide/multiple_sources.md @@ -1,8 +1,5 @@ # Multiple Sources for an Application -!!! warning "Beta Feature" - Specifying multiple sources for an application is a beta feature. This feature is subject to change in backwards incompatible ways until it is marked stable. - By default an Argo CD application is a link between a single source and a cluster. Sometimes however, you want to combine files from multiple locations to form a single Application. diff --git a/go.mod b/go.mod index b4dd7375c5e03a..844322a9813c2e 100644 --- a/go.mod +++ b/go.mod @@ -65,7 +65,7 @@ require ( github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/olekukonko/tablewriter v0.0.5 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/prometheus/client_golang v1.20.0 + github.com/prometheus/client_golang v1.20.1 github.com/r3labs/diff v1.1.0 github.com/redis/go-redis/v9 v9.6.1 github.com/robfig/cron/v3 v3.0.1 diff --git a/go.sum b/go.sum index 4ba05d33de6c23..1202f66461148f 100644 --- a/go.sum +++ b/go.sum @@ -1529,8 +1529,8 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.1 h1:IMJXHOD6eARkQpxo8KkhgEVFlBNm+nkrFUyGlIu7Na8= +github.com/prometheus/client_golang v1.20.1/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= diff --git a/hack/gen-resources/generators/cluster_generator.go b/hack/gen-resources/generators/cluster_generator.go index c07343f15c6d59..7a0896fd59d1e8 100644 --- a/hack/gen-resources/generators/cluster_generator.go +++ b/hack/gen-resources/generators/cluster_generator.go @@ -139,7 +139,7 @@ func (cg *ClusterGenerator) getClusterCredentials(namespace string, releaseSuffi // TODO: also should provision service for vcluster pod func (cg *ClusterGenerator) installVCluster(opts *util.GenerateOpts, namespace string, releaseName string) error { - cmd, err := helm.NewCmd("/tmp", "v3", "") + cmd, err := helm.NewCmd("/tmp", "v3", "", "") if err != nil { return err } diff --git a/manifests/base/dex/argocd-dex-server-deployment.yaml b/manifests/base/dex/argocd-dex-server-deployment.yaml index 42d2b705c9fbc8..f2d77c6ac1f6aa 100644 --- a/manifests/base/dex/argocd-dex-server-deployment.yaml +++ b/manifests/base/dex/argocd-dex-server-deployment.yaml @@ -41,6 +41,18 @@ spec: imagePullPolicy: Always command: [/shared/argocd-dex, rundex] env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true - name: ARGOCD_DEX_SERVER_DISABLE_TLS valueFrom: configMapKeyRef: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index df2d55bc516c3b..952c50ce433dea 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -23948,6 +23948,18 @@ spec: - /shared/argocd-dex - rundex env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true - name: ARGOCD_DEX_SERVER_DISABLE_TLS valueFrom: configMapKeyRef: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index 1376ffd4fea5f5..c125e96c4a29e9 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -1782,6 +1782,18 @@ spec: - /shared/argocd-dex - rundex env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true - name: ARGOCD_DEX_SERVER_DISABLE_TLS valueFrom: configMapKeyRef: diff --git a/manifests/install.yaml b/manifests/install.yaml index 969731f0033365..8f3b3d27218865 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -23065,6 +23065,18 @@ spec: - /shared/argocd-dex - rundex env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true - name: ARGOCD_DEX_SERVER_DISABLE_TLS valueFrom: configMapKeyRef: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 9bd3e25384635f..eaf86aa33ad484 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -899,6 +899,18 @@ spec: - /shared/argocd-dex - rundex env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true - name: ARGOCD_DEX_SERVER_DISABLE_TLS valueFrom: configMapKeyRef: diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index a7029c6f3232cf..cffcb88407ab9a 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -4564,281 +4564,281 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 11234 bytes of a gzipped FileDescriptorProto + // 11250 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, 0x75, 0x98, 0x66, 0x3f, 0x80, 0xdd, 0x87, 0xaf, 0x43, 0xdf, 0x1d, 0x89, 0x3b, 0x91, 0xc4, 0x79, - 0x68, 0x53, 0x54, 0x44, 0x02, 0xe6, 0x89, 0x94, 0x19, 0xd1, 0x92, 0x8c, 0x8f, 0x3b, 0x1c, 0xee, + 0x68, 0x53, 0x74, 0x44, 0x02, 0xe6, 0x89, 0x94, 0x19, 0xd1, 0x92, 0x8c, 0x8f, 0x3b, 0x1c, 0xee, 0x80, 0x03, 0xd8, 0xc0, 0xdd, 0x49, 0x94, 0x29, 0x6a, 0xb0, 0xdb, 0x58, 0xcc, 0x61, 0x76, 0x66, - 0x39, 0x33, 0x8b, 0x03, 0x68, 0x49, 0x96, 0x2c, 0xc9, 0x96, 0xa3, 0x0f, 0x2a, 0x52, 0xaa, 0x42, - 0x27, 0x96, 0x22, 0x5b, 0x4e, 0x2a, 0xae, 0x14, 0x2b, 0x4a, 0xf2, 0x23, 0x4e, 0x1c, 0x97, 0x2b, - 0x76, 0x2a, 0xa5, 0xc4, 0x49, 0xd9, 0xa5, 0x72, 0x59, 0x4e, 0x62, 0x23, 0xd2, 0xc5, 0xa9, 0xa4, + 0x39, 0x33, 0x8b, 0x03, 0x68, 0x49, 0x96, 0x2c, 0xc9, 0x96, 0xa3, 0x0f, 0x2a, 0x54, 0xaa, 0x42, + 0x27, 0x96, 0x22, 0x5b, 0x4e, 0x2a, 0xae, 0x94, 0x2a, 0x4a, 0xf2, 0x23, 0x4e, 0x1c, 0x97, 0x2b, + 0x76, 0x2a, 0xa5, 0xc4, 0x49, 0xd9, 0xa5, 0x72, 0x59, 0x4a, 0x62, 0x23, 0xd2, 0xc5, 0xa9, 0xa4, 0x52, 0x15, 0x57, 0xe5, 0xe3, 0x47, 0x72, 0xc9, 0x8f, 0x54, 0x7f, 0xf7, 0xcc, 0xce, 0x02, 0x0b, 0x60, 0x80, 0x3b, 0x29, 0xfc, 0xb7, 0xdb, 0xef, 0xcd, 0x7b, 0x3d, 0x3d, 0xdd, 0xef, 0xbd, 0x7e, 0xfd, 0xde, 0x6b, 0x58, 0x68, 0xb8, 0xf1, 0x46, 0x7b, 0x6d, 0xa2, 0x16, 0x34, 0x27, 0x9d, 0xb0, 0x11, 0xb4, 0xc2, 0xe0, 0x36, 0xfb, 0xf1, 0x74, 0xad, 0x3e, 0xb9, 0x75, 0x71, 0xb2, 0xb5, 0xd9, 0x98, 0x74, 0x5a, 0x6e, 0x34, 0xe9, 0xb4, 0x5a, 0x9e, 0x5b, 0x73, 0x62, 0x37, 0xf0, 0x27, 0xb7, 0x9e, 0x71, 0xbc, 0xd6, 0x86, 0xf3, 0xcc, 0x64, 0x83, 0xf8, 0x24, 0x74, 0x62, 0x52, 0x9f, 0x68, - 0x85, 0x41, 0x1c, 0xa0, 0x9f, 0xd4, 0xd4, 0x26, 0x24, 0x35, 0xf6, 0xe3, 0x95, 0x5a, 0x7d, 0x62, + 0x85, 0x41, 0x1c, 0xa0, 0x9f, 0xd2, 0xd4, 0x26, 0x24, 0x35, 0xf6, 0xe3, 0x95, 0x5a, 0x7d, 0x62, 0xeb, 0xe2, 0x44, 0x6b, 0xb3, 0x31, 0x41, 0xa9, 0x4d, 0x18, 0xd4, 0x26, 0x24, 0xb5, 0xf3, 0x4f, 0x1b, 0x7d, 0x69, 0x04, 0x8d, 0x60, 0x92, 0x11, 0x5d, 0x6b, 0xaf, 0xb3, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x99, 0x9d, 0xb7, 0x37, 0x9f, 0x8f, 0x26, 0xdc, 0x80, 0x76, 0x6f, 0xb2, 0x16, 0x84, 0x64, 0x72, 0xab, 0xa3, 0x43, 0xe7, 0xaf, 0x68, 0x1c, 0xb2, 0x1d, 0x13, 0x3f, 0x72, 0x03, 0x3f, 0x7a, 0x9a, 0x76, 0x81, 0x84, 0x5b, 0x24, 0x34, 0x5f, 0xcf, 0x40, 0xc8, 0xa2, 0xf4, 0xac, 0xa6, 0xd4, 0x74, 0x6a, 0x1b, 0xae, 0x4f, 0xc2, 0x1d, 0xfd, 0x78, 0x93, 0xc4, 0x4e, 0xd6, 0x53, 0x93, 0xdd, - 0x9e, 0x0a, 0xdb, 0x7e, 0xec, 0x36, 0x49, 0xc7, 0x03, 0xef, 0xd9, 0xef, 0x81, 0xa8, 0xb6, 0x41, - 0x9a, 0x4e, 0xc7, 0x73, 0xef, 0xee, 0xf6, 0x5c, 0x3b, 0x76, 0xbd, 0x49, 0xd7, 0x8f, 0xa3, 0x38, - 0x4c, 0x3f, 0x64, 0xff, 0xb2, 0x05, 0x43, 0x53, 0xb7, 0x56, 0xa6, 0xda, 0xf1, 0xc6, 0x4c, 0xe0, + 0x9e, 0x0a, 0xdb, 0x7e, 0xec, 0x36, 0x49, 0xc7, 0x03, 0xef, 0xde, 0xef, 0x81, 0xa8, 0xb6, 0x41, + 0x9a, 0x4e, 0xc7, 0x73, 0xef, 0xea, 0xf6, 0x5c, 0x3b, 0x76, 0xbd, 0x49, 0xd7, 0x8f, 0xa3, 0x38, + 0x4c, 0x3f, 0x64, 0xff, 0x8a, 0x05, 0x43, 0x53, 0xb7, 0x56, 0xa6, 0xda, 0xf1, 0xc6, 0x4c, 0xe0, 0xaf, 0xbb, 0x0d, 0xf4, 0x1c, 0x0c, 0xd4, 0xbc, 0x76, 0x14, 0x93, 0xf0, 0xba, 0xd3, 0x24, 0x63, - 0xd6, 0x05, 0xeb, 0xc9, 0xea, 0xf4, 0xe9, 0x6f, 0xef, 0x8e, 0xbf, 0xed, 0xee, 0xee, 0xf8, 0xc0, - 0x8c, 0x06, 0x61, 0x13, 0x0f, 0xbd, 0x13, 0xfa, 0xc3, 0xc0, 0x23, 0x53, 0xf8, 0xfa, 0x58, 0x81, - 0x3d, 0x32, 0x22, 0x1e, 0xe9, 0xc7, 0xbc, 0x19, 0x4b, 0x38, 0x45, 0x6d, 0x85, 0xc1, 0xba, 0xeb, - 0x91, 0xb1, 0x62, 0x12, 0x75, 0x99, 0x37, 0x63, 0x09, 0xb7, 0xff, 0xa8, 0x00, 0x30, 0xd5, 0x6a, - 0x2d, 0x87, 0xc1, 0x6d, 0x52, 0x8b, 0xd1, 0x47, 0xa1, 0x42, 0x87, 0xb9, 0xee, 0xc4, 0x0e, 0xeb, - 0xd8, 0xc0, 0xc5, 0x1f, 0x9f, 0xe0, 0x6f, 0x3d, 0x61, 0xbe, 0xb5, 0x9e, 0x64, 0x14, 0x7b, 0x62, - 0xeb, 0x99, 0x89, 0xa5, 0x35, 0xfa, 0xfc, 0x22, 0x89, 0x9d, 0x69, 0x24, 0x98, 0x81, 0x6e, 0xc3, - 0x8a, 0x2a, 0xf2, 0xa1, 0x14, 0xb5, 0x48, 0x8d, 0xbd, 0xc3, 0xc0, 0xc5, 0x85, 0x89, 0xa3, 0xcc, - 0xe6, 0x09, 0xdd, 0xf3, 0x95, 0x16, 0xa9, 0x4d, 0x0f, 0x0a, 0xce, 0x25, 0xfa, 0x0f, 0x33, 0x3e, - 0x68, 0x0b, 0xfa, 0xa2, 0xd8, 0x89, 0xdb, 0x11, 0x1b, 0x8a, 0x81, 0x8b, 0xd7, 0x73, 0xe3, 0xc8, - 0xa8, 0x4e, 0x0f, 0x0b, 0x9e, 0x7d, 0xfc, 0x3f, 0x16, 0xdc, 0xec, 0x3f, 0xb5, 0x60, 0x58, 0x23, - 0x2f, 0xb8, 0x51, 0x8c, 0x7e, 0xba, 0x63, 0x70, 0x27, 0x7a, 0x1b, 0x5c, 0xfa, 0x34, 0x1b, 0xda, - 0x53, 0x82, 0x59, 0x45, 0xb6, 0x18, 0x03, 0xdb, 0x84, 0xb2, 0x1b, 0x93, 0x66, 0x34, 0x56, 0xb8, - 0x50, 0x7c, 0x72, 0xe0, 0xe2, 0x95, 0xbc, 0xde, 0x73, 0x7a, 0x48, 0x30, 0x2d, 0xcf, 0x53, 0xf2, - 0x98, 0x73, 0xb1, 0x7f, 0x7d, 0xd0, 0x7c, 0x3f, 0x3a, 0xe0, 0xe8, 0x19, 0x18, 0x88, 0x82, 0x76, - 0x58, 0x23, 0x98, 0xb4, 0x82, 0x68, 0xcc, 0xba, 0x50, 0xa4, 0x53, 0x8f, 0x4e, 0xea, 0x15, 0xdd, - 0x8c, 0x4d, 0x1c, 0xf4, 0x25, 0x0b, 0x06, 0xeb, 0x24, 0x8a, 0x5d, 0x9f, 0xf1, 0x97, 0x9d, 0x5f, - 0x3d, 0x72, 0xe7, 0x65, 0xe3, 0xac, 0x26, 0x3e, 0x7d, 0x46, 0xbc, 0xc8, 0xa0, 0xd1, 0x18, 0xe1, - 0x04, 0x7f, 0xba, 0x38, 0xeb, 0x24, 0xaa, 0x85, 0x6e, 0x8b, 0xfe, 0x17, 0xcb, 0x47, 0x2d, 0xce, - 0x59, 0x0d, 0xc2, 0x26, 0x1e, 0xf2, 0xa1, 0x4c, 0x17, 0x5f, 0x34, 0x56, 0x62, 0xfd, 0x9f, 0x3f, - 0x5a, 0xff, 0xc5, 0xa0, 0xd2, 0x75, 0xad, 0x47, 0x9f, 0xfe, 0x8b, 0x30, 0x67, 0x83, 0xbe, 0x68, - 0xc1, 0x98, 0x10, 0x0e, 0x98, 0xf0, 0x01, 0xbd, 0xb5, 0xe1, 0xc6, 0xc4, 0x73, 0xa3, 0x78, 0xac, - 0xcc, 0xfa, 0x30, 0xd9, 0xdb, 0xdc, 0x9a, 0x0b, 0x83, 0x76, 0xeb, 0x9a, 0xeb, 0xd7, 0xa7, 0x2f, - 0x08, 0x4e, 0x63, 0x33, 0x5d, 0x08, 0xe3, 0xae, 0x2c, 0xd1, 0x57, 0x2d, 0x38, 0xef, 0x3b, 0x4d, - 0x12, 0xb5, 0x1c, 0xfa, 0x69, 0x39, 0x78, 0xda, 0x73, 0x6a, 0x9b, 0xac, 0x47, 0x7d, 0x87, 0xeb, - 0x91, 0x2d, 0x7a, 0x74, 0xfe, 0x7a, 0x57, 0xd2, 0x78, 0x0f, 0xb6, 0xe8, 0x9b, 0x16, 0x8c, 0x06, - 0x61, 0x6b, 0xc3, 0xf1, 0x49, 0x5d, 0x42, 0xa3, 0xb1, 0x7e, 0xb6, 0xf4, 0x3e, 0x72, 0xb4, 0x4f, - 0xb4, 0x94, 0x26, 0xbb, 0x18, 0xf8, 0x6e, 0x1c, 0x84, 0x2b, 0x24, 0x8e, 0x5d, 0xbf, 0x11, 0x4d, - 0x9f, 0xbd, 0xbb, 0x3b, 0x3e, 0xda, 0x81, 0x85, 0x3b, 0xfb, 0x83, 0x7e, 0x06, 0x06, 0xa2, 0x1d, - 0xbf, 0x76, 0xcb, 0xf5, 0xeb, 0xc1, 0x9d, 0x68, 0xac, 0x92, 0xc7, 0xf2, 0x5d, 0x51, 0x04, 0xc5, - 0x02, 0xd4, 0x0c, 0xb0, 0xc9, 0x2d, 0xfb, 0xc3, 0xe9, 0xa9, 0x54, 0xcd, 0xfb, 0xc3, 0xe9, 0xc9, - 0xb4, 0x07, 0x5b, 0xf4, 0x0b, 0x16, 0x0c, 0x45, 0x6e, 0xc3, 0x77, 0xe2, 0x76, 0x48, 0xae, 0x91, - 0x9d, 0x68, 0x0c, 0x58, 0x47, 0xae, 0x1e, 0x71, 0x54, 0x0c, 0x92, 0xd3, 0x67, 0x45, 0x1f, 0x87, - 0xcc, 0xd6, 0x08, 0x27, 0xf9, 0x66, 0x2d, 0x34, 0x3d, 0xad, 0x07, 0xf2, 0x5d, 0x68, 0x7a, 0x52, - 0x77, 0x65, 0x89, 0x7e, 0x0a, 0x4e, 0xf1, 0x26, 0x35, 0xb2, 0xd1, 0xd8, 0x20, 0x13, 0xb4, 0x67, - 0xee, 0xee, 0x8e, 0x9f, 0x5a, 0x49, 0xc1, 0x70, 0x07, 0x36, 0x7a, 0x15, 0xc6, 0x5b, 0x24, 0x6c, - 0xba, 0xf1, 0x92, 0xef, 0xed, 0x48, 0xf1, 0x5d, 0x0b, 0x5a, 0xa4, 0x2e, 0xba, 0x13, 0x8d, 0x0d, - 0x5d, 0xb0, 0x9e, 0xac, 0x4c, 0xbf, 0x43, 0x74, 0x73, 0x7c, 0x79, 0x6f, 0x74, 0xbc, 0x1f, 0x3d, - 0xfb, 0x5f, 0x14, 0xe0, 0x54, 0x5a, 0x71, 0xa2, 0xbf, 0x65, 0xc1, 0xc8, 0xed, 0x3b, 0xf1, 0x6a, - 0xb0, 0x49, 0xfc, 0x68, 0x7a, 0x87, 0x8a, 0x37, 0xa6, 0x32, 0x06, 0x2e, 0xd6, 0xf2, 0x55, 0xd1, - 0x13, 0x57, 0x93, 0x5c, 0x2e, 0xf9, 0x71, 0xb8, 0x33, 0xfd, 0xb0, 0x78, 0xbb, 0x91, 0xab, 0xb7, - 0x56, 0x4d, 0x28, 0x4e, 0x77, 0xea, 0xfc, 0xe7, 0x2d, 0x38, 0x93, 0x45, 0x02, 0x9d, 0x82, 0xe2, - 0x26, 0xd9, 0xe1, 0x06, 0x1c, 0xa6, 0x3f, 0xd1, 0xcb, 0x50, 0xde, 0x72, 0xbc, 0x36, 0x11, 0xd6, - 0xcd, 0xdc, 0xd1, 0x5e, 0x44, 0xf5, 0x0c, 0x73, 0xaa, 0xef, 0x2d, 0x3c, 0x6f, 0xd9, 0xbf, 0x5f, - 0x84, 0x01, 0x43, 0xbf, 0x9d, 0x80, 0xc5, 0x16, 0x24, 0x2c, 0xb6, 0xc5, 0xdc, 0x54, 0x73, 0x57, - 0x93, 0xed, 0x4e, 0xca, 0x64, 0x5b, 0xca, 0x8f, 0xe5, 0x9e, 0x36, 0x1b, 0x8a, 0xa1, 0x1a, 0xb4, - 0xa8, 0xf5, 0x4e, 0x55, 0x7f, 0x29, 0x8f, 0x4f, 0xb8, 0x24, 0xc9, 0x4d, 0x0f, 0xdd, 0xdd, 0x1d, - 0xaf, 0xaa, 0xbf, 0x58, 0x33, 0xb2, 0xbf, 0x6b, 0xc1, 0x19, 0xa3, 0x8f, 0x33, 0x81, 0x5f, 0x77, - 0xd9, 0xa7, 0xbd, 0x00, 0xa5, 0x78, 0xa7, 0x25, 0x77, 0x08, 0x6a, 0xa4, 0x56, 0x77, 0x5a, 0x04, - 0x33, 0x08, 0x35, 0xf4, 0x9b, 0x24, 0x8a, 0x9c, 0x06, 0x49, 0xef, 0x09, 0x16, 0x79, 0x33, 0x96, - 0x70, 0x14, 0x02, 0xf2, 0x9c, 0x28, 0x5e, 0x0d, 0x1d, 0x3f, 0x62, 0xe4, 0x57, 0xdd, 0x26, 0x11, - 0x03, 0xfc, 0x17, 0x7a, 0x9b, 0x31, 0xf4, 0x89, 0xe9, 0x87, 0xee, 0xee, 0x8e, 0xa3, 0x85, 0x0e, - 0x4a, 0x38, 0x83, 0xba, 0xfd, 0x55, 0x0b, 0x1e, 0xca, 0xb6, 0xc5, 0xd0, 0x13, 0xd0, 0xc7, 0xb7, - 0x87, 0xe2, 0xed, 0xf4, 0x27, 0x61, 0xad, 0x58, 0x40, 0xd1, 0x24, 0x54, 0x95, 0x9e, 0x10, 0xef, - 0x38, 0x2a, 0x50, 0xab, 0x5a, 0xb9, 0x68, 0x1c, 0x3a, 0x68, 0xf4, 0x8f, 0xb0, 0xdc, 0xd4, 0xa0, - 0xb1, 0xfd, 0x14, 0x83, 0xd8, 0xff, 0xde, 0x82, 0x11, 0xa3, 0x57, 0x27, 0x60, 0x9a, 0xfb, 0x49, - 0xd3, 0x7c, 0x3e, 0xb7, 0xf9, 0xdc, 0xc5, 0x36, 0xff, 0xa2, 0x05, 0xe7, 0x0d, 0xac, 0x45, 0x27, - 0xae, 0x6d, 0x5c, 0xda, 0x6e, 0x85, 0x24, 0xa2, 0x5b, 0x6f, 0xf4, 0xa8, 0x21, 0xb7, 0xa6, 0x07, - 0x04, 0x85, 0xe2, 0x35, 0xb2, 0xc3, 0x85, 0xd8, 0x53, 0x50, 0xe1, 0x93, 0x33, 0x08, 0xc5, 0x88, - 0xab, 0x77, 0x5b, 0x12, 0xed, 0x58, 0x61, 0x20, 0x1b, 0xfa, 0x98, 0x70, 0xa2, 0x8b, 0x95, 0xaa, - 0x21, 0xa0, 0x1f, 0xf1, 0x26, 0x6b, 0xc1, 0x02, 0x62, 0x47, 0x89, 0xee, 0x2c, 0x87, 0x84, 0x7d, - 0xdc, 0xfa, 0x65, 0x97, 0x78, 0xf5, 0x88, 0x6e, 0x1b, 0x1c, 0xdf, 0x0f, 0x62, 0xb1, 0x03, 0x30, - 0xb6, 0x0d, 0x53, 0xba, 0x19, 0x9b, 0x38, 0x94, 0xa9, 0xe7, 0xac, 0x11, 0x8f, 0x8f, 0xa8, 0x60, - 0xba, 0xc0, 0x5a, 0xb0, 0x80, 0xd8, 0x77, 0x0b, 0x6c, 0x83, 0xa2, 0x96, 0x3e, 0x39, 0x89, 0xdd, - 0x6d, 0x98, 0x90, 0x95, 0xcb, 0xf9, 0x09, 0x2e, 0xd2, 0x7d, 0x87, 0xfb, 0x5a, 0x4a, 0x5c, 0xe2, - 0x5c, 0xb9, 0xee, 0xbd, 0xcb, 0xfd, 0x64, 0x11, 0xc6, 0x93, 0x0f, 0x74, 0x48, 0x5b, 0xba, 0xa5, - 0x32, 0x18, 0xa5, 0xfd, 0x1d, 0x06, 0x3e, 0x36, 0xf1, 0xba, 0x08, 0xac, 0xc2, 0x71, 0x0a, 0x2c, - 0x53, 0x9e, 0x16, 0xf7, 0x91, 0xa7, 0x4f, 0xa8, 0x51, 0x2f, 0xa5, 0x04, 0x58, 0x52, 0xa7, 0x5c, - 0x80, 0x52, 0x14, 0x93, 0xd6, 0x58, 0x39, 0x29, 0x8f, 0x56, 0x62, 0xd2, 0xc2, 0x0c, 0x82, 0xde, - 0x07, 0x23, 0xb1, 0x13, 0x36, 0x48, 0x1c, 0x92, 0x2d, 0x97, 0xf9, 0xc6, 0xd8, 0x7e, 0xa9, 0x3a, - 0x7d, 0x9a, 0x9a, 0x27, 0xab, 0x0c, 0x84, 0x25, 0x08, 0xa7, 0x71, 0xed, 0xff, 0x52, 0x80, 0x87, - 0x93, 0x9f, 0x40, 0x6b, 0x90, 0x0f, 0x24, 0x34, 0xc8, 0xbb, 0x4c, 0x0d, 0x72, 0x6f, 0x77, 0xfc, - 0xed, 0x5d, 0x1e, 0xfb, 0x81, 0x51, 0x30, 0x68, 0x2e, 0xf5, 0x11, 0x26, 0x93, 0x1f, 0xe1, 0xde, - 0xee, 0xf8, 0xa3, 0x5d, 0xde, 0x31, 0xf5, 0x95, 0x9e, 0x80, 0xbe, 0x90, 0x38, 0x51, 0xe0, 0x8b, - 0xef, 0xa4, 0xbe, 0x26, 0x66, 0xad, 0x58, 0x40, 0xed, 0xef, 0x54, 0xd3, 0x83, 0x3d, 0xc7, 0xfd, - 0x7d, 0x41, 0x88, 0x5c, 0x28, 0xb1, 0x5d, 0x01, 0x97, 0x2c, 0xd7, 0x8e, 0xb6, 0x0a, 0xa9, 0x16, - 0x51, 0xa4, 0xa7, 0x2b, 0xf4, 0xab, 0xd1, 0x26, 0xcc, 0x58, 0xa0, 0x6d, 0xa8, 0xd4, 0xa4, 0xb1, - 0x5e, 0xc8, 0xc3, 0xad, 0x25, 0x4c, 0x75, 0xcd, 0x71, 0x90, 0x8a, 0x7b, 0x65, 0xe1, 0x2b, 0x6e, - 0x88, 0x40, 0xb1, 0xe1, 0xc6, 0xe2, 0xb3, 0x1e, 0x71, 0x3b, 0x36, 0xe7, 0x1a, 0xaf, 0xd8, 0x4f, - 0x75, 0xd0, 0x9c, 0x1b, 0x63, 0x4a, 0x1f, 0x7d, 0xd6, 0x82, 0x81, 0xa8, 0xd6, 0x5c, 0x0e, 0x83, - 0x2d, 0xb7, 0x4e, 0x42, 0x61, 0x8c, 0x1d, 0x51, 0xb2, 0xad, 0xcc, 0x2c, 0x4a, 0x82, 0x9a, 0x2f, - 0xdf, 0x1e, 0x6b, 0x08, 0x36, 0xf9, 0xd2, 0x4d, 0xca, 0xc3, 0xe2, 0xdd, 0x67, 0x49, 0x8d, 0xad, - 0x38, 0xb9, 0x27, 0x63, 0x33, 0xe5, 0xc8, 0xc6, 0xe9, 0x6c, 0xbb, 0xb6, 0x49, 0xd7, 0x9b, 0xee, - 0xd0, 0xdb, 0xef, 0xee, 0x8e, 0x3f, 0x3c, 0x93, 0xcd, 0x13, 0x77, 0xeb, 0x0c, 0x1b, 0xb0, 0x56, - 0xdb, 0xf3, 0x30, 0x79, 0xb5, 0x4d, 0x98, 0xc7, 0x25, 0x87, 0x01, 0x5b, 0xd6, 0x04, 0x53, 0x03, - 0x66, 0x40, 0xb0, 0xc9, 0x17, 0xbd, 0x0a, 0x7d, 0x4d, 0x27, 0x0e, 0xdd, 0x6d, 0xe1, 0x66, 0x39, - 0xe2, 0x76, 0x61, 0x91, 0xd1, 0xd2, 0xcc, 0x99, 0xa2, 0xe7, 0x8d, 0x58, 0x30, 0x42, 0x4d, 0x28, - 0x37, 0x49, 0xd8, 0x20, 0x63, 0x95, 0x3c, 0x5c, 0xca, 0x8b, 0x94, 0x94, 0x66, 0x58, 0xa5, 0xc6, - 0x15, 0x6b, 0xc3, 0x9c, 0x0b, 0x7a, 0x19, 0x2a, 0x11, 0xf1, 0x48, 0x8d, 0x9a, 0x47, 0x55, 0xc6, - 0xf1, 0xdd, 0x3d, 0x9a, 0x8a, 0xd4, 0x2e, 0x59, 0x11, 0x8f, 0xf2, 0x05, 0x26, 0xff, 0x61, 0x45, - 0x92, 0x0e, 0x60, 0xcb, 0x6b, 0x37, 0x5c, 0x7f, 0x0c, 0xf2, 0x18, 0xc0, 0x65, 0x46, 0x2b, 0x35, - 0x80, 0xbc, 0x11, 0x0b, 0x46, 0xf6, 0x7f, 0xb4, 0x00, 0x25, 0x85, 0xda, 0x09, 0xd8, 0xc4, 0xaf, - 0x26, 0x6d, 0xe2, 0x85, 0x3c, 0x8d, 0x96, 0x2e, 0x66, 0xf1, 0x6f, 0x56, 0x21, 0xa5, 0x0e, 0xae, - 0x93, 0x28, 0x26, 0xf5, 0xb7, 0x44, 0xf8, 0x5b, 0x22, 0xfc, 0x2d, 0x11, 0xae, 0x44, 0xf8, 0x5a, - 0x4a, 0x84, 0xbf, 0xdf, 0x58, 0xf5, 0xfa, 0xfc, 0xf6, 0x15, 0x75, 0xc0, 0x6b, 0xf6, 0xc0, 0x40, - 0xa0, 0x92, 0xe0, 0xea, 0xca, 0xd2, 0xf5, 0x4c, 0x99, 0xfd, 0x4a, 0x52, 0x66, 0x1f, 0x95, 0xc5, - 0xff, 0x0f, 0x52, 0xfa, 0x9f, 0x5b, 0xf0, 0x8e, 0xa4, 0xf4, 0x92, 0x33, 0x67, 0xbe, 0xe1, 0x07, - 0x21, 0x99, 0x75, 0xd7, 0xd7, 0x49, 0x48, 0xfc, 0x1a, 0x89, 0x94, 0x13, 0xc4, 0xea, 0xe6, 0x04, - 0x41, 0xcf, 0xc2, 0xe0, 0xed, 0x28, 0xf0, 0x97, 0x03, 0xd7, 0x17, 0x22, 0x88, 0xee, 0x38, 0x4e, - 0xdd, 0xdd, 0x1d, 0x1f, 0xa4, 0x23, 0x2a, 0xdb, 0x71, 0x02, 0x0b, 0xcd, 0xc0, 0xe8, 0xed, 0x57, - 0x97, 0x9d, 0xd8, 0xf0, 0x26, 0xc8, 0x7d, 0x3f, 0x3b, 0xef, 0xb8, 0xfa, 0x62, 0x0a, 0x88, 0x3b, - 0xf1, 0xed, 0xbf, 0x5e, 0x80, 0x73, 0xa9, 0x17, 0x09, 0x3c, 0x2f, 0x68, 0xc7, 0x74, 0x4f, 0x84, - 0xbe, 0x6e, 0xc1, 0xa9, 0x66, 0xd2, 0x61, 0x11, 0x09, 0xbf, 0xf0, 0x07, 0x73, 0xd3, 0x11, 0x29, - 0x8f, 0xc8, 0xf4, 0x98, 0x18, 0xa1, 0x53, 0x29, 0x40, 0x84, 0x3b, 0xfa, 0x82, 0x5e, 0x86, 0x6a, - 0xd3, 0xd9, 0xbe, 0xd1, 0xaa, 0x3b, 0xb1, 0xdc, 0x8e, 0x76, 0xf7, 0x22, 0xb4, 0x63, 0xd7, 0x9b, - 0xe0, 0x91, 0x01, 0x13, 0xf3, 0x7e, 0xbc, 0x14, 0xae, 0xc4, 0xa1, 0xeb, 0x37, 0xb8, 0x37, 0x70, - 0x51, 0x92, 0xc1, 0x9a, 0xa2, 0xfd, 0x35, 0x2b, 0xad, 0xa4, 0xd4, 0xe8, 0x84, 0x4e, 0x4c, 0x1a, - 0x3b, 0xe8, 0x63, 0x50, 0xa6, 0xfb, 0x46, 0x39, 0x2a, 0xb7, 0xf2, 0xd4, 0x9c, 0xc6, 0x97, 0xd0, - 0x4a, 0x94, 0xfe, 0x8b, 0x30, 0x67, 0x6a, 0x7f, 0xbd, 0x9a, 0x36, 0x16, 0xd8, 0xd9, 0xef, 0x45, - 0x80, 0x46, 0xb0, 0x4a, 0x9a, 0x2d, 0x8f, 0x0e, 0x8b, 0xc5, 0x0e, 0x10, 0x94, 0xab, 0x64, 0x4e, - 0x41, 0xb0, 0x81, 0x85, 0x7e, 0xd1, 0x02, 0x68, 0xc8, 0x39, 0x2f, 0x0d, 0x81, 0x1b, 0x79, 0xbe, - 0x8e, 0x5e, 0x51, 0xba, 0x2f, 0x8a, 0x21, 0x36, 0x98, 0xa3, 0x9f, 0xb3, 0xa0, 0x12, 0xcb, 0xee, - 0x73, 0xd5, 0xb8, 0x9a, 0x67, 0x4f, 0xe4, 0x4b, 0x6b, 0x9b, 0x48, 0x0d, 0x89, 0xe2, 0x8b, 0x7e, - 0xde, 0x02, 0x88, 0x76, 0xfc, 0xda, 0x72, 0xe0, 0xb9, 0xb5, 0x1d, 0xa1, 0x31, 0x6f, 0xe6, 0xea, - 0xce, 0x51, 0xd4, 0xa7, 0x87, 0xe9, 0x68, 0xe8, 0xff, 0xd8, 0xe0, 0x8c, 0x3e, 0x01, 0x95, 0x48, - 0x4c, 0x37, 0xa1, 0x23, 0x57, 0xf3, 0x75, 0x2a, 0x71, 0xda, 0x42, 0xbc, 0x8a, 0x7f, 0x58, 0xf1, - 0x44, 0x7f, 0xd5, 0x82, 0x91, 0x56, 0xd2, 0x4d, 0x28, 0xd4, 0x61, 0x7e, 0x32, 0x20, 0xe5, 0x86, - 0xe4, 0xde, 0x96, 0x54, 0x23, 0x4e, 0xf7, 0x82, 0x4a, 0x40, 0x3d, 0x83, 0x97, 0x5a, 0xdc, 0x65, - 0xd9, 0xaf, 0x25, 0xe0, 0x5c, 0x1a, 0x88, 0x3b, 0xf1, 0xd1, 0x32, 0x9c, 0xa1, 0xbd, 0xdb, 0xe1, - 0xe6, 0xa7, 0x54, 0x2f, 0x11, 0x53, 0x86, 0x95, 0xe9, 0x47, 0xc4, 0x0c, 0x61, 0x87, 0x02, 0x69, - 0x1c, 0x9c, 0xf9, 0x24, 0xfa, 0x7d, 0x0b, 0x1e, 0x71, 0x99, 0x1a, 0x30, 0xfd, 0xed, 0x5a, 0x23, - 0x88, 0x83, 0x5c, 0x92, 0xab, 0xac, 0xe8, 0xa6, 0x7e, 0xa6, 0x7f, 0x54, 0xbc, 0xc1, 0x23, 0xf3, - 0x7b, 0x74, 0x09, 0xef, 0xd9, 0x61, 0xf4, 0x13, 0x30, 0x24, 0xd7, 0xc5, 0x32, 0x15, 0xc1, 0x4c, - 0xd1, 0x56, 0xa7, 0x47, 0xef, 0xee, 0x8e, 0x0f, 0xad, 0x9a, 0x00, 0x9c, 0xc4, 0xb3, 0xff, 0x65, - 0x31, 0x71, 0x9c, 0xa2, 0x7c, 0x98, 0x4c, 0xdc, 0xd4, 0xa4, 0xff, 0x47, 0x4a, 0xcf, 0x5c, 0xc5, - 0x8d, 0xf2, 0x2e, 0x69, 0x71, 0xa3, 0x9a, 0x22, 0x6c, 0x30, 0xa7, 0x46, 0xe9, 0xa8, 0x93, 0xf6, - 0x94, 0x0a, 0x09, 0xf8, 0x72, 0x9e, 0x5d, 0xea, 0x3c, 0xfc, 0x3a, 0x27, 0xba, 0x36, 0xda, 0x01, - 0xc2, 0x9d, 0x5d, 0x42, 0x1f, 0x87, 0x6a, 0xa8, 0x22, 0x27, 0x8a, 0x79, 0x6c, 0xd5, 0xe4, 0xb4, - 0x11, 0xdd, 0x51, 0xa7, 0x39, 0x3a, 0x46, 0x42, 0x73, 0xb4, 0x7f, 0x2f, 0x79, 0x82, 0x64, 0xc8, - 0x8e, 0x1e, 0x4e, 0xc7, 0xbe, 0x64, 0xc1, 0x40, 0x18, 0x78, 0x9e, 0xeb, 0x37, 0xa8, 0x9c, 0x13, - 0xca, 0xfa, 0xc3, 0xc7, 0xa2, 0x2f, 0x85, 0x40, 0x63, 0x96, 0x35, 0xd6, 0x3c, 0xb1, 0xd9, 0x01, - 0xfb, 0x4f, 0x2d, 0x18, 0xeb, 0x26, 0x8f, 0x11, 0x81, 0xb7, 0x4b, 0x61, 0xa3, 0x86, 0x62, 0xc9, - 0x9f, 0x25, 0x1e, 0x51, 0x6e, 0xf3, 0xca, 0xf4, 0xe3, 0xe2, 0x35, 0xdf, 0xbe, 0xdc, 0x1d, 0x15, - 0xef, 0x45, 0x07, 0xbd, 0x04, 0xa7, 0x8c, 0xf7, 0x8a, 0xd4, 0xc0, 0x54, 0xa7, 0x27, 0xa8, 0x01, - 0x34, 0x95, 0x82, 0xdd, 0xdb, 0x1d, 0x7f, 0x28, 0xdd, 0x26, 0x14, 0x46, 0x07, 0x1d, 0xfb, 0xd7, - 0x0a, 0xe9, 0xaf, 0xa5, 0x74, 0xfd, 0x1b, 0x56, 0x87, 0x37, 0xe1, 0x83, 0xc7, 0xa1, 0x5f, 0x99, - 0xdf, 0x41, 0x85, 0x9f, 0x74, 0xc7, 0xb9, 0x8f, 0xe7, 0xdb, 0xf6, 0xbf, 0x2a, 0xc1, 0x1e, 0x3d, - 0xeb, 0xc1, 0x78, 0x3f, 0xf0, 0xa1, 0xe8, 0x17, 0x2c, 0x75, 0x60, 0xc6, 0xd7, 0x70, 0xfd, 0xb8, - 0xc6, 0x9e, 0xef, 0x9f, 0x22, 0x1e, 0x63, 0xa1, 0xbc, 0xe8, 0xc9, 0xa3, 0x39, 0xf4, 0x0d, 0x2b, - 0x79, 0xe4, 0xc7, 0x83, 0xe6, 0xdc, 0x63, 0xeb, 0x93, 0x71, 0x8e, 0xc8, 0x3b, 0xa6, 0x4f, 0x9f, - 0xba, 0x9d, 0x30, 0x4e, 0x00, 0xac, 0xbb, 0xbe, 0xe3, 0xb9, 0xaf, 0xd1, 0xdd, 0x51, 0x99, 0x29, - 0x78, 0x66, 0x31, 0x5d, 0x56, 0xad, 0xd8, 0xc0, 0x38, 0xff, 0x17, 0x61, 0xc0, 0x78, 0xf3, 0x8c, - 0xd0, 0x90, 0x33, 0x66, 0x68, 0x48, 0xd5, 0x88, 0xe8, 0x38, 0xff, 0x7e, 0x38, 0x95, 0xee, 0xe0, - 0x41, 0x9e, 0xb7, 0xff, 0x57, 0x7f, 0xfa, 0x0c, 0x6e, 0x95, 0x84, 0x4d, 0xda, 0xb5, 0xb7, 0x1c, - 0x5b, 0x6f, 0x39, 0xb6, 0xde, 0x72, 0x6c, 0x99, 0x67, 0x13, 0xc2, 0x69, 0xd3, 0x7f, 0x42, 0x4e, - 0x9b, 0x84, 0x1b, 0xaa, 0x92, 0xbb, 0x1b, 0xca, 0xfe, 0x6c, 0x87, 0xe7, 0x7e, 0x35, 0x24, 0x04, - 0x05, 0x50, 0xf6, 0x83, 0x3a, 0x91, 0x36, 0xee, 0xd5, 0x7c, 0x0c, 0xb6, 0xeb, 0x41, 0xdd, 0x08, - 0x47, 0xa6, 0xff, 0x22, 0xcc, 0xf9, 0xd8, 0x77, 0xcb, 0x90, 0x30, 0x27, 0xf9, 0x77, 0x7f, 0x27, - 0xf4, 0x87, 0xa4, 0x15, 0xdc, 0xc0, 0x0b, 0x42, 0x97, 0xe9, 0x8c, 0x05, 0xde, 0x8c, 0x25, 0x9c, - 0xea, 0xbc, 0x96, 0x13, 0x6f, 0x08, 0x65, 0xa6, 0x74, 0xde, 0xb2, 0x13, 0x6f, 0x60, 0x06, 0x41, - 0xef, 0x87, 0xe1, 0x38, 0x71, 0x14, 0x2e, 0x8e, 0x7c, 0x1f, 0x12, 0xb8, 0xc3, 0xc9, 0x83, 0x72, - 0x9c, 0xc2, 0x46, 0xaf, 0x42, 0x69, 0x83, 0x78, 0x4d, 0xf1, 0xe9, 0x57, 0xf2, 0xd3, 0x35, 0xec, - 0x5d, 0xaf, 0x10, 0xaf, 0xc9, 0x25, 0x21, 0xfd, 0x85, 0x19, 0x2b, 0x3a, 0xef, 0xab, 0x9b, 0xed, - 0x28, 0x0e, 0x9a, 0xee, 0x6b, 0xd2, 0xd3, 0xf9, 0xc1, 0x9c, 0x19, 0x5f, 0x93, 0xf4, 0xb9, 0x4b, - 0x49, 0xfd, 0xc5, 0x9a, 0x33, 0xeb, 0x47, 0xdd, 0x0d, 0xd9, 0x94, 0xd9, 0x11, 0x0e, 0xcb, 0xbc, - 0xfb, 0x31, 0x2b, 0xe9, 0xf3, 0x7e, 0xa8, 0xbf, 0x58, 0x73, 0x46, 0x3b, 0x6a, 0xfd, 0x0d, 0xb0, - 0x3e, 0xdc, 0xc8, 0xb9, 0x0f, 0x7c, 0xed, 0x65, 0xae, 0xc3, 0xc7, 0xa1, 0x5c, 0xdb, 0x70, 0xc2, - 0x78, 0x6c, 0x90, 0x4d, 0x1a, 0x35, 0x8b, 0x67, 0x68, 0x23, 0xe6, 0x30, 0xf4, 0x28, 0x14, 0x43, - 0xb2, 0xce, 0xa2, 0x5f, 0x8d, 0xb8, 0x28, 0x4c, 0xd6, 0x31, 0x6d, 0xb7, 0x7f, 0xa5, 0x90, 0x34, - 0xdb, 0x92, 0xef, 0xcd, 0x67, 0x7b, 0xad, 0x1d, 0x46, 0xd2, 0xfd, 0x65, 0xcc, 0x76, 0xd6, 0x8c, - 0x25, 0x1c, 0x7d, 0xca, 0x82, 0xfe, 0xdb, 0x51, 0xe0, 0xfb, 0x24, 0x16, 0x2a, 0xf2, 0x66, 0xce, - 0x43, 0x71, 0x95, 0x53, 0xd7, 0x7d, 0x10, 0x0d, 0x58, 0xf2, 0xa5, 0xdd, 0x25, 0xdb, 0x35, 0xaf, - 0x5d, 0xef, 0x08, 0x75, 0xb9, 0xc4, 0x9b, 0xb1, 0x84, 0x53, 0x54, 0xd7, 0xe7, 0xa8, 0xa5, 0x24, - 0xea, 0xbc, 0x2f, 0x50, 0x05, 0xdc, 0xfe, 0x56, 0x3f, 0x9c, 0xcd, 0x5c, 0x1c, 0xd4, 0xa0, 0x62, - 0x26, 0xcb, 0x65, 0xd7, 0x23, 0x32, 0xc8, 0x8b, 0x19, 0x54, 0x37, 0x55, 0x2b, 0x36, 0x30, 0xd0, - 0xcf, 0x02, 0xb4, 0x9c, 0xd0, 0x69, 0x12, 0xe5, 0x9e, 0x3e, 0xb2, 0xdd, 0x42, 0xfb, 0xb1, 0x2c, - 0x69, 0xea, 0x2d, 0xba, 0x6a, 0x8a, 0xb0, 0xc1, 0x12, 0x3d, 0x07, 0x03, 0x21, 0xf1, 0x88, 0x13, - 0xb1, 0xe0, 0xe9, 0x74, 0x26, 0x08, 0xd6, 0x20, 0x6c, 0xe2, 0xa1, 0x27, 0x54, 0x3c, 0x5c, 0x2a, - 0x2e, 0x28, 0x19, 0x13, 0x87, 0x5e, 0xb7, 0x60, 0x78, 0xdd, 0xf5, 0x88, 0xe6, 0x2e, 0xf2, 0x36, - 0x96, 0x8e, 0xfe, 0x92, 0x97, 0x4d, 0xba, 0x5a, 0x42, 0x26, 0x9a, 0x23, 0x9c, 0x62, 0x4f, 0x3f, - 0xf3, 0x16, 0x09, 0x99, 0x68, 0xed, 0x4b, 0x7e, 0xe6, 0x9b, 0xbc, 0x19, 0x4b, 0x38, 0x9a, 0x82, - 0x91, 0x96, 0x13, 0x45, 0x33, 0x21, 0xa9, 0x13, 0x3f, 0x76, 0x1d, 0x8f, 0x67, 0x55, 0x54, 0x74, - 0x54, 0xf5, 0x72, 0x12, 0x8c, 0xd3, 0xf8, 0xe8, 0x43, 0xf0, 0x30, 0xf7, 0xff, 0x2c, 0xba, 0x51, - 0xe4, 0xfa, 0x0d, 0x3d, 0x0d, 0x84, 0x1b, 0x6c, 0x5c, 0x90, 0x7a, 0x78, 0x3e, 0x1b, 0x0d, 0x77, - 0x7b, 0x1e, 0x3d, 0x05, 0x95, 0x68, 0xd3, 0x6d, 0xcd, 0x84, 0xf5, 0x88, 0x9d, 0xfd, 0x54, 0xb4, - 0xd3, 0x75, 0x45, 0xb4, 0x63, 0x85, 0x81, 0x6a, 0x30, 0xc8, 0x3f, 0x09, 0x0f, 0xe8, 0x13, 0xf2, - 0xf1, 0xe9, 0xae, 0x6a, 0x5a, 0x24, 0x09, 0x4e, 0x60, 0xe7, 0xce, 0x25, 0x79, 0x12, 0xc5, 0x0f, - 0x4e, 0x6e, 0x1a, 0x64, 0x70, 0x82, 0x68, 0x72, 0xc7, 0x36, 0xd0, 0xc3, 0x8e, 0xed, 0x39, 0x18, - 0xd8, 0x6c, 0xaf, 0x11, 0x31, 0xf2, 0x42, 0x6c, 0xa9, 0xd9, 0x77, 0x4d, 0x83, 0xb0, 0x89, 0xc7, - 0x62, 0x29, 0x5b, 0xae, 0xf8, 0x17, 0x8d, 0x0d, 0x19, 0xb1, 0x94, 0xcb, 0xf3, 0xb2, 0x19, 0x9b, - 0x38, 0xf6, 0x2f, 0x15, 0x92, 0x4e, 0x09, 0x53, 0x7e, 0xa0, 0x88, 0x4a, 0x89, 0xf8, 0xa6, 0x13, - 0x4a, 0x5b, 0xe2, 0x88, 0x79, 0x29, 0x82, 0xee, 0x4d, 0x27, 0x34, 0xe5, 0x0d, 0x63, 0x80, 0x25, - 0x27, 0x74, 0x1b, 0x4a, 0xb1, 0xe7, 0xe4, 0x94, 0xc8, 0x66, 0x70, 0xd4, 0x3e, 0xa2, 0x85, 0xa9, - 0x08, 0x33, 0x1e, 0xe8, 0x11, 0xba, 0x31, 0x5a, 0x93, 0x87, 0x58, 0x62, 0x2f, 0xb3, 0x16, 0x61, - 0xd6, 0x6a, 0xff, 0xd9, 0x40, 0x86, 0xc8, 0x57, 0x3a, 0x16, 0x5d, 0x04, 0xa0, 0x5f, 0x6c, 0x39, - 0x24, 0xeb, 0xee, 0xb6, 0xb0, 0x71, 0x94, 0x58, 0xb9, 0xae, 0x20, 0xd8, 0xc0, 0x92, 0xcf, 0xac, - 0xb4, 0xd7, 0xe9, 0x33, 0x85, 0xce, 0x67, 0x38, 0x04, 0x1b, 0x58, 0xe8, 0x59, 0xe8, 0x73, 0x9b, - 0x4e, 0x43, 0xc5, 0xd8, 0x3e, 0x42, 0xe5, 0xc9, 0x3c, 0x6b, 0xb9, 0xb7, 0x3b, 0x3e, 0xac, 0x3a, - 0xc4, 0x9a, 0xb0, 0xc0, 0x45, 0xbf, 0x66, 0xc1, 0x60, 0x2d, 0x68, 0x36, 0x03, 0x9f, 0xef, 0x4c, - 0xc5, 0x36, 0xfb, 0xf6, 0x71, 0x59, 0x20, 0x13, 0x33, 0x06, 0x33, 0xbe, 0xcf, 0x56, 0x19, 0x77, - 0x26, 0x08, 0x27, 0x7a, 0x65, 0x8a, 0x9d, 0xf2, 0x3e, 0x62, 0xe7, 0x37, 0x2c, 0x18, 0xe5, 0xcf, - 0x1a, 0x1b, 0x66, 0x91, 0x5c, 0x16, 0x1c, 0xf3, 0x6b, 0x75, 0xf8, 0x10, 0x94, 0x1f, 0xb5, 0x03, - 0x8e, 0x3b, 0x3b, 0x89, 0xe6, 0x60, 0x74, 0x3d, 0x08, 0x6b, 0xc4, 0x1c, 0x08, 0x21, 0x33, 0x15, - 0xa1, 0xcb, 0x69, 0x04, 0xdc, 0xf9, 0x0c, 0xba, 0x09, 0x0f, 0x19, 0x8d, 0xe6, 0x38, 0x70, 0xb1, - 0xf9, 0x98, 0xa0, 0xf6, 0xd0, 0xe5, 0x4c, 0x2c, 0xdc, 0xe5, 0xe9, 0xa4, 0x84, 0xaa, 0xf6, 0x20, - 0xa1, 0x5e, 0x81, 0x73, 0xb5, 0xce, 0x91, 0xd9, 0x8a, 0xda, 0x6b, 0x11, 0x17, 0xa2, 0x95, 0xe9, - 0x1f, 0x11, 0x04, 0xce, 0xcd, 0x74, 0x43, 0xc4, 0xdd, 0x69, 0xa0, 0x8f, 0x41, 0x25, 0x24, 0xec, - 0xab, 0x44, 0x22, 0xd3, 0xea, 0x88, 0x8e, 0x04, 0x6d, 0x1c, 0x73, 0xb2, 0x5a, 0x2d, 0x88, 0x86, - 0x08, 0x2b, 0x8e, 0xe8, 0x0e, 0xf4, 0xb7, 0x9c, 0xb8, 0xb6, 0x21, 0xf2, 0xab, 0x8e, 0xec, 0xf6, - 0x56, 0xcc, 0xd9, 0x29, 0x85, 0x91, 0x91, 0xcd, 0x99, 0x60, 0xc9, 0x8d, 0x1a, 0x4a, 0xb5, 0xa0, - 0xd9, 0x0a, 0x7c, 0xe2, 0xc7, 0x52, 0x82, 0x0f, 0xf3, 0xa3, 0x04, 0xd9, 0x8a, 0x0d, 0x0c, 0xb4, - 0x0c, 0x67, 0x98, 0x5b, 0xed, 0x96, 0x1b, 0x6f, 0x04, 0xed, 0x58, 0xee, 0x12, 0xc7, 0x86, 0x93, - 0x87, 0x49, 0x0b, 0x19, 0x38, 0x38, 0xf3, 0xc9, 0xb4, 0xee, 0x19, 0x39, 0x9c, 0xee, 0x39, 0xb5, - 0xbf, 0xee, 0x39, 0xff, 0x01, 0x18, 0xed, 0x10, 0x1a, 0x07, 0xf2, 0x9d, 0xcd, 0xc2, 0x43, 0xd9, - 0xcb, 0xf3, 0x40, 0x1e, 0xb4, 0x7f, 0x90, 0x0a, 0xa1, 0x36, 0x76, 0x13, 0x3d, 0x78, 0x63, 0x1d, - 0x28, 0x12, 0x7f, 0x4b, 0x68, 0xab, 0xcb, 0x47, 0x9b, 0x25, 0x97, 0xfc, 0x2d, 0x2e, 0x5d, 0x98, - 0xcb, 0xe9, 0x92, 0xbf, 0x85, 0x29, 0x6d, 0xf4, 0x15, 0x2b, 0x61, 0x0d, 0x73, 0x1f, 0xee, 0x47, - 0x8e, 0x65, 0xfb, 0xd4, 0xb3, 0x81, 0x6c, 0xff, 0xeb, 0x02, 0x5c, 0xd8, 0x8f, 0x48, 0x0f, 0xc3, - 0xf7, 0x38, 0xf4, 0x45, 0x2c, 0x28, 0x42, 0x88, 0xff, 0x01, 0xba, 0x2a, 0x78, 0x98, 0xc4, 0x2b, - 0x58, 0x80, 0x90, 0x07, 0xc5, 0xa6, 0xd3, 0x12, 0xae, 0xbd, 0xf9, 0xa3, 0xe6, 0x64, 0xd1, 0xff, - 0x8e, 0xb7, 0xe8, 0xb4, 0xf8, 0xf4, 0x34, 0x1a, 0x30, 0x65, 0x83, 0x62, 0x28, 0x3b, 0x61, 0xe8, - 0xc8, 0x13, 0xf8, 0x6b, 0xf9, 0xf0, 0x9b, 0xa2, 0x24, 0xf9, 0x01, 0x66, 0xa2, 0x09, 0x73, 0x66, - 0xf6, 0x17, 0xfa, 0x13, 0x79, 0x49, 0x2c, 0xac, 0x22, 0x82, 0x3e, 0xe1, 0xd1, 0xb3, 0xf2, 0x4e, - 0x85, 0xe3, 0x89, 0xa5, 0x6c, 0xb3, 0x2c, 0xd2, 0xf3, 0x05, 0x2b, 0xf4, 0x79, 0x8b, 0x25, 0xc1, - 0xcb, 0x5c, 0x2d, 0xb1, 0x45, 0x3d, 0x9e, 0x9c, 0x7c, 0x33, 0xb5, 0x5e, 0x36, 0x62, 0x93, 0xbb, - 0x28, 0x66, 0xc1, 0x4c, 0xf3, 0xce, 0x62, 0x16, 0xcc, 0xd4, 0x96, 0x70, 0xb4, 0x9d, 0x11, 0x3e, - 0x91, 0x43, 0x22, 0x75, 0x0f, 0x01, 0x13, 0xdf, 0xb0, 0x60, 0xd4, 0x4d, 0x9f, 0x83, 0x8b, 0x0d, - 0xdd, 0xad, 0x7c, 0xdc, 0x6f, 0x9d, 0xc7, 0xec, 0xca, 0x70, 0xe8, 0x00, 0xe1, 0xce, 0xce, 0xa0, - 0x3a, 0x94, 0x5c, 0x7f, 0x3d, 0x10, 0xe6, 0xd2, 0xf4, 0xd1, 0x3a, 0x35, 0xef, 0xaf, 0x07, 0x7a, - 0x35, 0xd3, 0x7f, 0x98, 0x51, 0x47, 0x0b, 0x70, 0x46, 0xa6, 0xa6, 0x5c, 0x71, 0xa3, 0x38, 0x08, - 0x77, 0x16, 0xdc, 0xa6, 0x1b, 0x33, 0x53, 0xa7, 0x38, 0x3d, 0x46, 0x35, 0x11, 0xce, 0x80, 0xe3, - 0xcc, 0xa7, 0xd0, 0x6b, 0xd0, 0x2f, 0xcf, 0x9e, 0x2b, 0x79, 0x6c, 0x8e, 0x3b, 0xe7, 0xbf, 0x9a, - 0x4c, 0x2b, 0xe2, 0xf0, 0x59, 0x32, 0xb4, 0x5f, 0x1f, 0x80, 0xce, 0x23, 0xf2, 0xe4, 0x79, 0xb8, - 0x75, 0xd2, 0xe7, 0xe1, 0x74, 0x6b, 0x14, 0xe9, 0xa3, 0xec, 0x1c, 0xe6, 0xb6, 0xe0, 0xaa, 0x8f, - 0x29, 0x77, 0xfc, 0x1a, 0x66, 0x3c, 0x50, 0x08, 0x7d, 0x1b, 0xc4, 0xf1, 0xe2, 0x8d, 0x7c, 0x4e, - 0x54, 0xae, 0x30, 0x5a, 0xe9, 0x7c, 0x32, 0xde, 0x8a, 0x05, 0x27, 0xb4, 0x0d, 0xfd, 0x1b, 0x7c, - 0x02, 0x88, 0xdd, 0xca, 0xe2, 0x51, 0x07, 0x37, 0x31, 0xab, 0xf4, 0xe7, 0x16, 0x0d, 0x58, 0xb2, - 0x63, 0xb1, 0x57, 0x46, 0x74, 0x08, 0x5f, 0xba, 0xf9, 0xa5, 0xd2, 0xf5, 0x1e, 0x1a, 0xf2, 0x51, - 0x18, 0x0c, 0x49, 0x2d, 0xf0, 0x6b, 0xae, 0x47, 0xea, 0x53, 0xf2, 0xb4, 0xe4, 0x20, 0x19, 0x54, - 0xcc, 0x19, 0x81, 0x0d, 0x1a, 0x38, 0x41, 0x11, 0x7d, 0xce, 0x82, 0x61, 0x95, 0x7e, 0x4c, 0x3f, - 0x08, 0x11, 0x5e, 0xf1, 0x85, 0x9c, 0x92, 0x9d, 0x19, 0xcd, 0x69, 0x74, 0x77, 0x77, 0x7c, 0x38, - 0xd9, 0x86, 0x53, 0x7c, 0xd1, 0x4b, 0x00, 0xc1, 0x1a, 0x0f, 0xb0, 0x9a, 0x8a, 0x85, 0x8b, 0xfc, - 0x20, 0xaf, 0x3a, 0xcc, 0x33, 0x31, 0x25, 0x05, 0x6c, 0x50, 0x43, 0xd7, 0x00, 0xf8, 0xb2, 0x59, - 0xdd, 0x69, 0xc9, 0x2d, 0x8d, 0x4c, 0x81, 0x83, 0x15, 0x05, 0xb9, 0xb7, 0x3b, 0xde, 0xe9, 0xb2, - 0x64, 0x51, 0x24, 0xc6, 0xe3, 0xe8, 0x67, 0xa0, 0x3f, 0x6a, 0x37, 0x9b, 0x8e, 0x72, 0xa0, 0xe7, - 0x98, 0xdb, 0xc9, 0xe9, 0x1a, 0xa2, 0x88, 0x37, 0x60, 0xc9, 0x11, 0xdd, 0xa6, 0x42, 0x35, 0x12, - 0xbe, 0x54, 0xb6, 0x8a, 0xb8, 0x4d, 0xc0, 0x1d, 0x49, 0xef, 0x91, 0x26, 0x3e, 0xce, 0xc0, 0xb9, - 0xb7, 0x3b, 0xfe, 0x50, 0xb2, 0x7d, 0x21, 0x10, 0xd9, 0x96, 0x99, 0x34, 0xd1, 0x55, 0x59, 0xc4, - 0x87, 0xbe, 0xb6, 0xac, 0x2d, 0xf1, 0xa4, 0x2e, 0xe2, 0xc3, 0x9a, 0xbb, 0x8f, 0x99, 0xf9, 0x30, - 0x5a, 0x84, 0xd3, 0xb5, 0xc0, 0x8f, 0xc3, 0xc0, 0xf3, 0x78, 0x11, 0x2b, 0xbe, 0xbb, 0xe4, 0x0e, - 0xf6, 0xb7, 0x8b, 0x6e, 0x9f, 0x9e, 0xe9, 0x44, 0xc1, 0x59, 0xcf, 0xd9, 0x7e, 0xf2, 0xb0, 0x4b, - 0x0c, 0xce, 0xb3, 0x30, 0x48, 0xb6, 0x63, 0x12, 0xfa, 0x8e, 0x77, 0x03, 0x2f, 0x48, 0xd7, 0x32, - 0x5b, 0x03, 0x97, 0x8c, 0x76, 0x9c, 0xc0, 0x42, 0xb6, 0x72, 0xa9, 0x18, 0x19, 0xc4, 0xdc, 0xa5, - 0x22, 0x1d, 0x28, 0xf6, 0xff, 0x2e, 0x24, 0x0c, 0xb2, 0xfb, 0x72, 0xb4, 0xc6, 0x4a, 0xa1, 0xc8, - 0x9a, 0x31, 0x0c, 0x20, 0x36, 0x1a, 0x79, 0x72, 0x56, 0xa5, 0x50, 0x96, 0x4c, 0x46, 0x38, 0xc9, - 0x17, 0x6d, 0x42, 0x79, 0x23, 0x88, 0x62, 0xb9, 0xfd, 0x38, 0xe2, 0x4e, 0xe7, 0x4a, 0x10, 0xc5, - 0xcc, 0x8a, 0x50, 0xaf, 0x4d, 0x5b, 0x22, 0xcc, 0x79, 0xd8, 0xff, 0xc9, 0x4a, 0x1c, 0x24, 0xdc, - 0x62, 0x51, 0xd8, 0x5b, 0xc4, 0xa7, 0xcb, 0xda, 0x8c, 0xfb, 0xfa, 0x89, 0x54, 0x4e, 0xeb, 0x3b, - 0xba, 0xd5, 0x68, 0xbb, 0x43, 0x29, 0x4c, 0x30, 0x12, 0x46, 0x88, 0xd8, 0x27, 0xad, 0x64, 0x72, - 0x72, 0x21, 0x8f, 0x0d, 0x86, 0x99, 0xa0, 0xbf, 0x6f, 0x9e, 0xb3, 0xfd, 0x15, 0x0b, 0xfa, 0xa7, + 0xd6, 0x05, 0xeb, 0xc9, 0xea, 0xf4, 0xe9, 0x6f, 0xed, 0x8e, 0xbf, 0xed, 0xee, 0xee, 0xf8, 0xc0, + 0x8c, 0x06, 0x61, 0x13, 0x0f, 0xfd, 0x38, 0xf4, 0x87, 0x81, 0x47, 0xa6, 0xf0, 0xf5, 0xb1, 0x02, + 0x7b, 0x64, 0x44, 0x3c, 0xd2, 0x8f, 0x79, 0x33, 0x96, 0x70, 0x8a, 0xda, 0x0a, 0x83, 0x75, 0xd7, + 0x23, 0x63, 0xc5, 0x24, 0xea, 0x32, 0x6f, 0xc6, 0x12, 0x6e, 0xff, 0x71, 0x01, 0x60, 0xaa, 0xd5, + 0x5a, 0x0e, 0x83, 0xdb, 0xa4, 0x16, 0xa3, 0x8f, 0x40, 0x85, 0x0e, 0x73, 0xdd, 0x89, 0x1d, 0xd6, + 0xb1, 0x81, 0x8b, 0x3f, 0x31, 0xc1, 0xdf, 0x7a, 0xc2, 0x7c, 0x6b, 0x3d, 0xc9, 0x28, 0xf6, 0xc4, + 0xd6, 0x33, 0x13, 0x4b, 0x6b, 0xf4, 0xf9, 0x45, 0x12, 0x3b, 0xd3, 0x48, 0x30, 0x03, 0xdd, 0x86, + 0x15, 0x55, 0xe4, 0x43, 0x29, 0x6a, 0x91, 0x1a, 0x7b, 0x87, 0x81, 0x8b, 0x0b, 0x13, 0x47, 0x99, + 0xcd, 0x13, 0xba, 0xe7, 0x2b, 0x2d, 0x52, 0x9b, 0x1e, 0x14, 0x9c, 0x4b, 0xf4, 0x1f, 0x66, 0x7c, + 0xd0, 0x16, 0xf4, 0x45, 0xb1, 0x13, 0xb7, 0x23, 0x36, 0x14, 0x03, 0x17, 0xaf, 0xe7, 0xc6, 0x91, + 0x51, 0x9d, 0x1e, 0x16, 0x3c, 0xfb, 0xf8, 0x7f, 0x2c, 0xb8, 0xd9, 0x7f, 0x6a, 0xc1, 0xb0, 0x46, + 0x5e, 0x70, 0xa3, 0x18, 0xfd, 0x4c, 0xc7, 0xe0, 0x4e, 0xf4, 0x36, 0xb8, 0xf4, 0x69, 0x36, 0xb4, + 0xa7, 0x04, 0xb3, 0x8a, 0x6c, 0x31, 0x06, 0xb6, 0x09, 0x65, 0x37, 0x26, 0xcd, 0x68, 0xac, 0x70, + 0xa1, 0xf8, 0xe4, 0xc0, 0xc5, 0x2b, 0x79, 0xbd, 0xe7, 0xf4, 0x90, 0x60, 0x5a, 0x9e, 0xa7, 0xe4, + 0x31, 0xe7, 0x62, 0xff, 0xc6, 0xa0, 0xf9, 0x7e, 0x74, 0xc0, 0xd1, 0x33, 0x30, 0x10, 0x05, 0xed, + 0xb0, 0x46, 0x30, 0x69, 0x05, 0xd1, 0x98, 0x75, 0xa1, 0x48, 0xa7, 0x1e, 0x9d, 0xd4, 0x2b, 0xba, + 0x19, 0x9b, 0x38, 0xe8, 0x8b, 0x16, 0x0c, 0xd6, 0x49, 0x14, 0xbb, 0x3e, 0xe3, 0x2f, 0x3b, 0xbf, + 0x7a, 0xe4, 0xce, 0xcb, 0xc6, 0x59, 0x4d, 0x7c, 0xfa, 0x8c, 0x78, 0x91, 0x41, 0xa3, 0x31, 0xc2, + 0x09, 0xfe, 0x74, 0x71, 0xd6, 0x49, 0x54, 0x0b, 0xdd, 0x16, 0xfd, 0x2f, 0x96, 0x8f, 0x5a, 0x9c, + 0xb3, 0x1a, 0x84, 0x4d, 0x3c, 0xe4, 0x43, 0x99, 0x2e, 0xbe, 0x68, 0xac, 0xc4, 0xfa, 0x3f, 0x7f, + 0xb4, 0xfe, 0x8b, 0x41, 0xa5, 0xeb, 0x5a, 0x8f, 0x3e, 0xfd, 0x17, 0x61, 0xce, 0x06, 0x7d, 0xc1, + 0x82, 0x31, 0x21, 0x1c, 0x30, 0xe1, 0x03, 0x7a, 0x6b, 0xc3, 0x8d, 0x89, 0xe7, 0x46, 0xf1, 0x58, + 0x99, 0xf5, 0x61, 0xb2, 0xb7, 0xb9, 0x35, 0x17, 0x06, 0xed, 0xd6, 0x35, 0xd7, 0xaf, 0x4f, 0x5f, + 0x10, 0x9c, 0xc6, 0x66, 0xba, 0x10, 0xc6, 0x5d, 0x59, 0xa2, 0x2f, 0x5b, 0x70, 0xde, 0x77, 0x9a, + 0x24, 0x6a, 0x39, 0xf4, 0xd3, 0x72, 0xf0, 0xb4, 0xe7, 0xd4, 0x36, 0x59, 0x8f, 0xfa, 0x0e, 0xd7, + 0x23, 0x5b, 0xf4, 0xe8, 0xfc, 0xf5, 0xae, 0xa4, 0xf1, 0x1e, 0x6c, 0xd1, 0xd7, 0x2d, 0x18, 0x0d, + 0xc2, 0xd6, 0x86, 0xe3, 0x93, 0xba, 0x84, 0x46, 0x63, 0xfd, 0x6c, 0xe9, 0x7d, 0xf8, 0x68, 0x9f, + 0x68, 0x29, 0x4d, 0x76, 0x31, 0xf0, 0xdd, 0x38, 0x08, 0x57, 0x48, 0x1c, 0xbb, 0x7e, 0x23, 0x9a, + 0x3e, 0x7b, 0x77, 0x77, 0x7c, 0xb4, 0x03, 0x0b, 0x77, 0xf6, 0x07, 0xfd, 0x2c, 0x0c, 0x44, 0x3b, + 0x7e, 0xed, 0x96, 0xeb, 0xd7, 0x83, 0x3b, 0xd1, 0x58, 0x25, 0x8f, 0xe5, 0xbb, 0xa2, 0x08, 0x8a, + 0x05, 0xa8, 0x19, 0x60, 0x93, 0x5b, 0xf6, 0x87, 0xd3, 0x53, 0xa9, 0x9a, 0xf7, 0x87, 0xd3, 0x93, + 0x69, 0x0f, 0xb6, 0xe8, 0x17, 0x2d, 0x18, 0x8a, 0xdc, 0x86, 0xef, 0xc4, 0xed, 0x90, 0x5c, 0x23, + 0x3b, 0xd1, 0x18, 0xb0, 0x8e, 0x5c, 0x3d, 0xe2, 0xa8, 0x18, 0x24, 0xa7, 0xcf, 0x8a, 0x3e, 0x0e, + 0x99, 0xad, 0x11, 0x4e, 0xf2, 0xcd, 0x5a, 0x68, 0x7a, 0x5a, 0x0f, 0xe4, 0xbb, 0xd0, 0xf4, 0xa4, + 0xee, 0xca, 0x12, 0xfd, 0x34, 0x9c, 0xe2, 0x4d, 0x6a, 0x64, 0xa3, 0xb1, 0x41, 0x26, 0x68, 0xcf, + 0xdc, 0xdd, 0x1d, 0x3f, 0xb5, 0x92, 0x82, 0xe1, 0x0e, 0x6c, 0xf4, 0x2a, 0x8c, 0xb7, 0x48, 0xd8, + 0x74, 0xe3, 0x25, 0xdf, 0xdb, 0x91, 0xe2, 0xbb, 0x16, 0xb4, 0x48, 0x5d, 0x74, 0x27, 0x1a, 0x1b, + 0xba, 0x60, 0x3d, 0x59, 0x99, 0x7e, 0x87, 0xe8, 0xe6, 0xf8, 0xf2, 0xde, 0xe8, 0x78, 0x3f, 0x7a, + 0xf6, 0xbf, 0x28, 0xc0, 0xa9, 0xb4, 0xe2, 0x44, 0x7f, 0xcb, 0x82, 0x91, 0xdb, 0x77, 0xe2, 0xd5, + 0x60, 0x93, 0xf8, 0xd1, 0xf4, 0x0e, 0x15, 0x6f, 0x4c, 0x65, 0x0c, 0x5c, 0xac, 0xe5, 0xab, 0xa2, + 0x27, 0xae, 0x26, 0xb9, 0x5c, 0xf2, 0xe3, 0x70, 0x67, 0xfa, 0x61, 0xf1, 0x76, 0x23, 0x57, 0x6f, + 0xad, 0x9a, 0x50, 0x9c, 0xee, 0xd4, 0xf9, 0xcf, 0x59, 0x70, 0x26, 0x8b, 0x04, 0x3a, 0x05, 0xc5, + 0x4d, 0xb2, 0xc3, 0x0d, 0x38, 0x4c, 0x7f, 0xa2, 0x97, 0xa1, 0xbc, 0xe5, 0x78, 0x6d, 0x22, 0xac, + 0x9b, 0xb9, 0xa3, 0xbd, 0x88, 0xea, 0x19, 0xe6, 0x54, 0xdf, 0x53, 0x78, 0xde, 0xb2, 0xff, 0xa0, + 0x08, 0x03, 0x86, 0x7e, 0x3b, 0x01, 0x8b, 0x2d, 0x48, 0x58, 0x6c, 0x8b, 0xb9, 0xa9, 0xe6, 0xae, + 0x26, 0xdb, 0x9d, 0x94, 0xc9, 0xb6, 0x94, 0x1f, 0xcb, 0x3d, 0x6d, 0x36, 0x14, 0x43, 0x35, 0x68, + 0x51, 0xeb, 0x9d, 0xaa, 0xfe, 0x52, 0x1e, 0x9f, 0x70, 0x49, 0x92, 0x9b, 0x1e, 0xba, 0xbb, 0x3b, + 0x5e, 0x55, 0x7f, 0xb1, 0x66, 0x64, 0x7f, 0xc7, 0x82, 0x33, 0x46, 0x1f, 0x67, 0x02, 0xbf, 0xee, + 0xb2, 0x4f, 0x7b, 0x01, 0x4a, 0xf1, 0x4e, 0x4b, 0xee, 0x10, 0xd4, 0x48, 0xad, 0xee, 0xb4, 0x08, + 0x66, 0x10, 0x6a, 0xe8, 0x37, 0x49, 0x14, 0x39, 0x0d, 0x92, 0xde, 0x13, 0x2c, 0xf2, 0x66, 0x2c, + 0xe1, 0x28, 0x04, 0xe4, 0x39, 0x51, 0xbc, 0x1a, 0x3a, 0x7e, 0xc4, 0xc8, 0xaf, 0xba, 0x4d, 0x22, + 0x06, 0xf8, 0x2f, 0xf4, 0x36, 0x63, 0xe8, 0x13, 0xd3, 0x0f, 0xdd, 0xdd, 0x1d, 0x47, 0x0b, 0x1d, + 0x94, 0x70, 0x06, 0x75, 0xfb, 0xcb, 0x16, 0x3c, 0x94, 0x6d, 0x8b, 0xa1, 0x27, 0xa0, 0x8f, 0x6f, + 0x0f, 0xc5, 0xdb, 0xe9, 0x4f, 0xc2, 0x5a, 0xb1, 0x80, 0xa2, 0x49, 0xa8, 0x2a, 0x3d, 0x21, 0xde, + 0x71, 0x54, 0xa0, 0x56, 0xb5, 0x72, 0xd1, 0x38, 0x74, 0xd0, 0xe8, 0x1f, 0x61, 0xb9, 0xa9, 0x41, + 0x63, 0xfb, 0x29, 0x06, 0xb1, 0xff, 0xbd, 0x05, 0x23, 0x46, 0xaf, 0x4e, 0xc0, 0x34, 0xf7, 0x93, + 0xa6, 0xf9, 0x7c, 0x6e, 0xf3, 0xb9, 0x8b, 0x6d, 0xfe, 0x05, 0x0b, 0xce, 0x1b, 0x58, 0x8b, 0x4e, + 0x5c, 0xdb, 0xb8, 0xb4, 0xdd, 0x0a, 0x49, 0x44, 0xb7, 0xde, 0xe8, 0x51, 0x43, 0x6e, 0x4d, 0x0f, + 0x08, 0x0a, 0xc5, 0x6b, 0x64, 0x87, 0x0b, 0xb1, 0xa7, 0xa0, 0xc2, 0x27, 0x67, 0x10, 0x8a, 0x11, + 0x57, 0xef, 0xb6, 0x24, 0xda, 0xb1, 0xc2, 0x40, 0x36, 0xf4, 0x31, 0xe1, 0x44, 0x17, 0x2b, 0x55, + 0x43, 0x40, 0x3f, 0xe2, 0x4d, 0xd6, 0x82, 0x05, 0xc4, 0x8e, 0x12, 0xdd, 0x59, 0x0e, 0x09, 0xfb, + 0xb8, 0xf5, 0xcb, 0x2e, 0xf1, 0xea, 0x11, 0xdd, 0x36, 0x38, 0xbe, 0x1f, 0xc4, 0x62, 0x07, 0x60, + 0x6c, 0x1b, 0xa6, 0x74, 0x33, 0x36, 0x71, 0x28, 0x53, 0xcf, 0x59, 0x23, 0x1e, 0x1f, 0x51, 0xc1, + 0x74, 0x81, 0xb5, 0x60, 0x01, 0xb1, 0xef, 0x16, 0xd8, 0x06, 0x45, 0x2d, 0x7d, 0x72, 0x12, 0xbb, + 0xdb, 0x30, 0x21, 0x2b, 0x97, 0xf3, 0x13, 0x5c, 0xa4, 0xfb, 0x0e, 0xf7, 0xb5, 0x94, 0xb8, 0xc4, + 0xb9, 0x72, 0xdd, 0x7b, 0x97, 0xfb, 0x89, 0x22, 0x8c, 0x27, 0x1f, 0xe8, 0x90, 0xb6, 0x74, 0x4b, + 0x65, 0x30, 0x4a, 0xfb, 0x3b, 0x0c, 0x7c, 0x6c, 0xe2, 0x75, 0x11, 0x58, 0x85, 0xe3, 0x14, 0x58, + 0xa6, 0x3c, 0x2d, 0xee, 0x23, 0x4f, 0x9f, 0x50, 0xa3, 0x5e, 0x4a, 0x09, 0xb0, 0xa4, 0x4e, 0xb9, + 0x00, 0xa5, 0x28, 0x26, 0xad, 0xb1, 0x72, 0x52, 0x1e, 0xad, 0xc4, 0xa4, 0x85, 0x19, 0x04, 0xbd, + 0x17, 0x46, 0x62, 0x27, 0x6c, 0x90, 0x38, 0x24, 0x5b, 0x2e, 0xf3, 0x8d, 0xb1, 0xfd, 0x52, 0x75, + 0xfa, 0x34, 0x35, 0x4f, 0x56, 0x19, 0x08, 0x4b, 0x10, 0x4e, 0xe3, 0xda, 0xff, 0xa5, 0x00, 0x0f, + 0x27, 0x3f, 0x81, 0xd6, 0x20, 0xef, 0x4f, 0x68, 0x90, 0x77, 0x9a, 0x1a, 0xe4, 0xde, 0xee, 0xf8, + 0xdb, 0xbb, 0x3c, 0xf6, 0x03, 0xa3, 0x60, 0xd0, 0x5c, 0xea, 0x23, 0x4c, 0x26, 0x3f, 0xc2, 0xbd, + 0xdd, 0xf1, 0x47, 0xbb, 0xbc, 0x63, 0xea, 0x2b, 0x3d, 0x01, 0x7d, 0x21, 0x71, 0xa2, 0xc0, 0x17, + 0xdf, 0x49, 0x7d, 0x4d, 0xcc, 0x5a, 0xb1, 0x80, 0xda, 0xdf, 0xae, 0xa6, 0x07, 0x7b, 0x8e, 0xfb, + 0xfb, 0x82, 0x10, 0xb9, 0x50, 0x62, 0xbb, 0x02, 0x2e, 0x59, 0xae, 0x1d, 0x6d, 0x15, 0x52, 0x2d, + 0xa2, 0x48, 0x4f, 0x57, 0xe8, 0x57, 0xa3, 0x4d, 0x98, 0xb1, 0x40, 0xdb, 0x50, 0xa9, 0x49, 0x63, + 0xbd, 0x90, 0x87, 0x5b, 0x4b, 0x98, 0xea, 0x9a, 0xe3, 0x20, 0x15, 0xf7, 0xca, 0xc2, 0x57, 0xdc, + 0x10, 0x81, 0x62, 0xc3, 0x8d, 0xc5, 0x67, 0x3d, 0xe2, 0x76, 0x6c, 0xce, 0x35, 0x5e, 0xb1, 0x9f, + 0xea, 0xa0, 0x39, 0x37, 0xc6, 0x94, 0x3e, 0xfa, 0x8c, 0x05, 0x03, 0x51, 0xad, 0xb9, 0x1c, 0x06, + 0x5b, 0x6e, 0x9d, 0x84, 0xc2, 0x18, 0x3b, 0xa2, 0x64, 0x5b, 0x99, 0x59, 0x94, 0x04, 0x35, 0x5f, + 0xbe, 0x3d, 0xd6, 0x10, 0x6c, 0xf2, 0xa5, 0x9b, 0x94, 0x87, 0xc5, 0xbb, 0xcf, 0x92, 0x1a, 0x5b, + 0x71, 0x72, 0x4f, 0xc6, 0x66, 0xca, 0x91, 0x8d, 0xd3, 0xd9, 0x76, 0x6d, 0x93, 0xae, 0x37, 0xdd, + 0xa1, 0xb7, 0xdf, 0xdd, 0x1d, 0x7f, 0x78, 0x26, 0x9b, 0x27, 0xee, 0xd6, 0x19, 0x36, 0x60, 0xad, + 0xb6, 0xe7, 0x61, 0xf2, 0x6a, 0x9b, 0x30, 0x8f, 0x4b, 0x0e, 0x03, 0xb6, 0xac, 0x09, 0xa6, 0x06, + 0xcc, 0x80, 0x60, 0x93, 0x2f, 0x7a, 0x15, 0xfa, 0x9a, 0x4e, 0x1c, 0xba, 0xdb, 0xc2, 0xcd, 0x72, + 0xc4, 0xed, 0xc2, 0x22, 0xa3, 0xa5, 0x99, 0x33, 0x45, 0xcf, 0x1b, 0xb1, 0x60, 0x84, 0x9a, 0x50, + 0x6e, 0x92, 0xb0, 0x41, 0xc6, 0x2a, 0x79, 0xb8, 0x94, 0x17, 0x29, 0x29, 0xcd, 0xb0, 0x4a, 0x8d, + 0x2b, 0xd6, 0x86, 0x39, 0x17, 0xf4, 0x32, 0x54, 0x22, 0xe2, 0x91, 0x1a, 0x35, 0x8f, 0xaa, 0x8c, + 0xe3, 0xbb, 0x7a, 0x34, 0x15, 0xa9, 0x5d, 0xb2, 0x22, 0x1e, 0xe5, 0x0b, 0x4c, 0xfe, 0xc3, 0x8a, + 0x24, 0x1d, 0xc0, 0x96, 0xd7, 0x6e, 0xb8, 0xfe, 0x18, 0xe4, 0x31, 0x80, 0xcb, 0x8c, 0x56, 0x6a, + 0x00, 0x79, 0x23, 0x16, 0x8c, 0xec, 0xff, 0x68, 0x01, 0x4a, 0x0a, 0xb5, 0x13, 0xb0, 0x89, 0x5f, + 0x4d, 0xda, 0xc4, 0x0b, 0x79, 0x1a, 0x2d, 0x5d, 0xcc, 0xe2, 0xdf, 0xaa, 0x42, 0x4a, 0x1d, 0x5c, + 0x27, 0x51, 0x4c, 0xea, 0x6f, 0x89, 0xf0, 0xb7, 0x44, 0xf8, 0x5b, 0x22, 0x5c, 0x89, 0xf0, 0xb5, + 0x94, 0x08, 0x7f, 0x9f, 0xb1, 0xea, 0xf5, 0xf9, 0xed, 0x2b, 0xea, 0x80, 0xd7, 0xec, 0x81, 0x81, + 0x40, 0x25, 0xc1, 0xd5, 0x95, 0xa5, 0xeb, 0x99, 0x32, 0xfb, 0x95, 0xa4, 0xcc, 0x3e, 0x2a, 0x8b, + 0xff, 0x1f, 0xa4, 0xf4, 0x3f, 0xb7, 0xe0, 0x1d, 0x49, 0xe9, 0x25, 0x67, 0xce, 0x7c, 0xc3, 0x0f, + 0x42, 0x32, 0xeb, 0xae, 0xaf, 0x93, 0x90, 0xf8, 0x35, 0x12, 0x29, 0x27, 0x88, 0xd5, 0xcd, 0x09, + 0x82, 0x9e, 0x85, 0xc1, 0xdb, 0x51, 0xe0, 0x2f, 0x07, 0xae, 0x2f, 0x44, 0x10, 0xdd, 0x71, 0x9c, + 0xba, 0xbb, 0x3b, 0x3e, 0x48, 0x47, 0x54, 0xb6, 0xe3, 0x04, 0x16, 0x9a, 0x81, 0xd1, 0xdb, 0xaf, + 0x2e, 0x3b, 0xb1, 0xe1, 0x4d, 0x90, 0xfb, 0x7e, 0x76, 0xde, 0x71, 0xf5, 0xc5, 0x14, 0x10, 0x77, + 0xe2, 0xdb, 0x7f, 0xbd, 0x00, 0xe7, 0x52, 0x2f, 0x12, 0x78, 0x5e, 0xd0, 0x8e, 0xe9, 0x9e, 0x08, + 0x7d, 0xd5, 0x82, 0x53, 0xcd, 0xa4, 0xc3, 0x22, 0x12, 0x7e, 0xe1, 0x0f, 0xe4, 0xa6, 0x23, 0x52, + 0x1e, 0x91, 0xe9, 0x31, 0x31, 0x42, 0xa7, 0x52, 0x80, 0x08, 0x77, 0xf4, 0x05, 0xbd, 0x0c, 0xd5, + 0xa6, 0xb3, 0x7d, 0xa3, 0x55, 0x77, 0x62, 0xb9, 0x1d, 0xed, 0xee, 0x45, 0x68, 0xc7, 0xae, 0x37, + 0xc1, 0x23, 0x03, 0x26, 0xe6, 0xfd, 0x78, 0x29, 0x5c, 0x89, 0x43, 0xd7, 0x6f, 0x70, 0x6f, 0xe0, + 0xa2, 0x24, 0x83, 0x35, 0x45, 0xfb, 0x2b, 0x56, 0x5a, 0x49, 0xa9, 0xd1, 0x09, 0x9d, 0x98, 0x34, + 0x76, 0xd0, 0x47, 0xa1, 0x4c, 0xf7, 0x8d, 0x72, 0x54, 0x6e, 0xe5, 0xa9, 0x39, 0x8d, 0x2f, 0xa1, + 0x95, 0x28, 0xfd, 0x17, 0x61, 0xce, 0xd4, 0xfe, 0x6a, 0x35, 0x6d, 0x2c, 0xb0, 0xb3, 0xdf, 0x8b, + 0x00, 0x8d, 0x60, 0x95, 0x34, 0x5b, 0x1e, 0x1d, 0x16, 0x8b, 0x1d, 0x20, 0x28, 0x57, 0xc9, 0x9c, + 0x82, 0x60, 0x03, 0x0b, 0xfd, 0x92, 0x05, 0xd0, 0x90, 0x73, 0x5e, 0x1a, 0x02, 0x37, 0xf2, 0x7c, + 0x1d, 0xbd, 0xa2, 0x74, 0x5f, 0x14, 0x43, 0x6c, 0x30, 0x47, 0x3f, 0x6f, 0x41, 0x25, 0x96, 0xdd, + 0xe7, 0xaa, 0x71, 0x35, 0xcf, 0x9e, 0xc8, 0x97, 0xd6, 0x36, 0x91, 0x1a, 0x12, 0xc5, 0x17, 0xfd, + 0x82, 0x05, 0x10, 0xed, 0xf8, 0xb5, 0xe5, 0xc0, 0x73, 0x6b, 0x3b, 0x42, 0x63, 0xde, 0xcc, 0xd5, + 0x9d, 0xa3, 0xa8, 0x4f, 0x0f, 0xd3, 0xd1, 0xd0, 0xff, 0xb1, 0xc1, 0x19, 0x7d, 0x1c, 0x2a, 0x91, + 0x98, 0x6e, 0x42, 0x47, 0xae, 0xe6, 0xeb, 0x54, 0xe2, 0xb4, 0x85, 0x78, 0x15, 0xff, 0xb0, 0xe2, + 0x89, 0xfe, 0xaa, 0x05, 0x23, 0xad, 0xa4, 0x9b, 0x50, 0xa8, 0xc3, 0xfc, 0x64, 0x40, 0xca, 0x0d, + 0xc9, 0xbd, 0x2d, 0xa9, 0x46, 0x9c, 0xee, 0x05, 0x95, 0x80, 0x7a, 0x06, 0x2f, 0xb5, 0xb8, 0xcb, + 0xb2, 0x5f, 0x4b, 0xc0, 0xb9, 0x34, 0x10, 0x77, 0xe2, 0xa3, 0x65, 0x38, 0x43, 0x7b, 0xb7, 0xc3, + 0xcd, 0x4f, 0xa9, 0x5e, 0x22, 0xa6, 0x0c, 0x2b, 0xd3, 0x8f, 0x88, 0x19, 0xc2, 0x0e, 0x05, 0xd2, + 0x38, 0x38, 0xf3, 0x49, 0xf4, 0x07, 0x16, 0x3c, 0xe2, 0x32, 0x35, 0x60, 0xfa, 0xdb, 0xb5, 0x46, + 0x10, 0x07, 0xb9, 0x24, 0x57, 0x59, 0xd1, 0x4d, 0xfd, 0x4c, 0xff, 0xa8, 0x78, 0x83, 0x47, 0xe6, + 0xf7, 0xe8, 0x12, 0xde, 0xb3, 0xc3, 0xe8, 0x27, 0x61, 0x48, 0xae, 0x8b, 0x65, 0x2a, 0x82, 0x99, + 0xa2, 0xad, 0x4e, 0x8f, 0xde, 0xdd, 0x1d, 0x1f, 0x5a, 0x35, 0x01, 0x38, 0x89, 0x67, 0xff, 0xcb, + 0x62, 0xe2, 0x38, 0x45, 0xf9, 0x30, 0x99, 0xb8, 0xa9, 0x49, 0xff, 0x8f, 0x94, 0x9e, 0xb9, 0x8a, + 0x1b, 0xe5, 0x5d, 0xd2, 0xe2, 0x46, 0x35, 0x45, 0xd8, 0x60, 0x4e, 0x8d, 0xd2, 0x51, 0x27, 0xed, + 0x29, 0x15, 0x12, 0xf0, 0xe5, 0x3c, 0xbb, 0xd4, 0x79, 0xf8, 0x75, 0x4e, 0x74, 0x6d, 0xb4, 0x03, + 0x84, 0x3b, 0xbb, 0x84, 0x3e, 0x06, 0xd5, 0x50, 0x45, 0x4e, 0x14, 0xf3, 0xd8, 0xaa, 0xc9, 0x69, + 0x23, 0xba, 0xa3, 0x4e, 0x73, 0x74, 0x8c, 0x84, 0xe6, 0x68, 0xff, 0x7e, 0xf2, 0x04, 0xc9, 0x90, + 0x1d, 0x3d, 0x9c, 0x8e, 0x7d, 0xd1, 0x82, 0x81, 0x30, 0xf0, 0x3c, 0xd7, 0x6f, 0x50, 0x39, 0x27, + 0x94, 0xf5, 0x87, 0x8e, 0x45, 0x5f, 0x0a, 0x81, 0xc6, 0x2c, 0x6b, 0xac, 0x79, 0x62, 0xb3, 0x03, + 0xf6, 0x9f, 0x5a, 0x30, 0xd6, 0x4d, 0x1e, 0x23, 0x02, 0x6f, 0x97, 0xc2, 0x46, 0x0d, 0xc5, 0x92, + 0x3f, 0x4b, 0x3c, 0xa2, 0xdc, 0xe6, 0x95, 0xe9, 0xc7, 0xc5, 0x6b, 0xbe, 0x7d, 0xb9, 0x3b, 0x2a, + 0xde, 0x8b, 0x0e, 0x7a, 0x09, 0x4e, 0x19, 0xef, 0x15, 0xa9, 0x81, 0xa9, 0x4e, 0x4f, 0x50, 0x03, + 0x68, 0x2a, 0x05, 0xbb, 0xb7, 0x3b, 0xfe, 0x50, 0xba, 0x4d, 0x28, 0x8c, 0x0e, 0x3a, 0xf6, 0xaf, + 0x17, 0xd2, 0x5f, 0x4b, 0xe9, 0xfa, 0x37, 0xad, 0x0e, 0x6f, 0xc2, 0x07, 0x8e, 0x43, 0xbf, 0x32, + 0xbf, 0x83, 0x0a, 0x3f, 0xe9, 0x8e, 0x73, 0x1f, 0xcf, 0xb7, 0xed, 0x7f, 0x55, 0x82, 0x3d, 0x7a, + 0xd6, 0x83, 0xf1, 0x7e, 0xe0, 0x43, 0xd1, 0xcf, 0x5b, 0xea, 0xc0, 0x8c, 0xaf, 0xe1, 0xfa, 0x71, + 0x8d, 0x3d, 0xdf, 0x3f, 0x45, 0x3c, 0xc6, 0x42, 0x79, 0xd1, 0x93, 0x47, 0x73, 0xe8, 0x6b, 0x56, + 0xf2, 0xc8, 0x8f, 0x07, 0xcd, 0xb9, 0xc7, 0xd6, 0x27, 0xe3, 0x1c, 0x91, 0x77, 0x4c, 0x9f, 0x3e, + 0x75, 0x3b, 0x61, 0x9c, 0x00, 0x58, 0x77, 0x7d, 0xc7, 0x73, 0x5f, 0xa3, 0xbb, 0xa3, 0x32, 0x53, + 0xf0, 0xcc, 0x62, 0xba, 0xac, 0x5a, 0xb1, 0x81, 0x71, 0xfe, 0x2f, 0xc2, 0x80, 0xf1, 0xe6, 0x19, + 0xa1, 0x21, 0x67, 0xcc, 0xd0, 0x90, 0xaa, 0x11, 0xd1, 0x71, 0xfe, 0x7d, 0x70, 0x2a, 0xdd, 0xc1, + 0x83, 0x3c, 0x6f, 0xff, 0xaf, 0xfe, 0xf4, 0x19, 0xdc, 0x2a, 0x09, 0x9b, 0xb4, 0x6b, 0x6f, 0x39, + 0xb6, 0xde, 0x72, 0x6c, 0xbd, 0xe5, 0xd8, 0x32, 0xcf, 0x26, 0x84, 0xd3, 0xa6, 0xff, 0x84, 0x9c, + 0x36, 0x09, 0x37, 0x54, 0x25, 0x77, 0x37, 0x94, 0xfd, 0x99, 0x0e, 0xcf, 0xfd, 0x6a, 0x48, 0x08, + 0x0a, 0xa0, 0xec, 0x07, 0x75, 0x22, 0x6d, 0xdc, 0xab, 0xf9, 0x18, 0x6c, 0xd7, 0x83, 0xba, 0x11, + 0x8e, 0x4c, 0xff, 0x45, 0x98, 0xf3, 0xb1, 0xef, 0x96, 0x21, 0x61, 0x4e, 0xf2, 0xef, 0xfe, 0xe3, + 0xd0, 0x1f, 0x92, 0x56, 0x70, 0x03, 0x2f, 0x08, 0x5d, 0xa6, 0x33, 0x16, 0x78, 0x33, 0x96, 0x70, + 0xaa, 0xf3, 0x5a, 0x4e, 0xbc, 0x21, 0x94, 0x99, 0xd2, 0x79, 0xcb, 0x4e, 0xbc, 0x81, 0x19, 0x04, + 0xbd, 0x0f, 0x86, 0xe3, 0xc4, 0x51, 0xb8, 0x38, 0xf2, 0x7d, 0x48, 0xe0, 0x0e, 0x27, 0x0f, 0xca, + 0x71, 0x0a, 0x1b, 0xbd, 0x0a, 0xa5, 0x0d, 0xe2, 0x35, 0xc5, 0xa7, 0x5f, 0xc9, 0x4f, 0xd7, 0xb0, + 0x77, 0xbd, 0x42, 0xbc, 0x26, 0x97, 0x84, 0xf4, 0x17, 0x66, 0xac, 0xe8, 0xbc, 0xaf, 0x6e, 0xb6, + 0xa3, 0x38, 0x68, 0xba, 0xaf, 0x49, 0x4f, 0xe7, 0x07, 0x72, 0x66, 0x7c, 0x4d, 0xd2, 0xe7, 0x2e, + 0x25, 0xf5, 0x17, 0x6b, 0xce, 0xac, 0x1f, 0x75, 0x37, 0x64, 0x53, 0x66, 0x47, 0x38, 0x2c, 0xf3, + 0xee, 0xc7, 0xac, 0xa4, 0xcf, 0xfb, 0xa1, 0xfe, 0x62, 0xcd, 0x19, 0xed, 0xa8, 0xf5, 0x37, 0xc0, + 0xfa, 0x70, 0x23, 0xe7, 0x3e, 0xf0, 0xb5, 0x97, 0xb9, 0x0e, 0x1f, 0x87, 0x72, 0x6d, 0xc3, 0x09, + 0xe3, 0xb1, 0x41, 0x36, 0x69, 0xd4, 0x2c, 0x9e, 0xa1, 0x8d, 0x98, 0xc3, 0xd0, 0xa3, 0x50, 0x0c, + 0xc9, 0x3a, 0x8b, 0x7e, 0x35, 0xe2, 0xa2, 0x30, 0x59, 0xc7, 0xb4, 0xdd, 0xfe, 0xd5, 0x42, 0xd2, + 0x6c, 0x4b, 0xbe, 0x37, 0x9f, 0xed, 0xb5, 0x76, 0x18, 0x49, 0xf7, 0x97, 0x31, 0xdb, 0x59, 0x33, + 0x96, 0x70, 0xf4, 0x49, 0x0b, 0xfa, 0x6f, 0x47, 0x81, 0xef, 0x93, 0x58, 0xa8, 0xc8, 0x9b, 0x39, + 0x0f, 0xc5, 0x55, 0x4e, 0x5d, 0xf7, 0x41, 0x34, 0x60, 0xc9, 0x97, 0x76, 0x97, 0x6c, 0xd7, 0xbc, + 0x76, 0xbd, 0x23, 0xd4, 0xe5, 0x12, 0x6f, 0xc6, 0x12, 0x4e, 0x51, 0x5d, 0x9f, 0xa3, 0x96, 0x92, + 0xa8, 0xf3, 0xbe, 0x40, 0x15, 0x70, 0xfb, 0x9b, 0xfd, 0x70, 0x36, 0x73, 0x71, 0x50, 0x83, 0x8a, + 0x99, 0x2c, 0x97, 0x5d, 0x8f, 0xc8, 0x20, 0x2f, 0x66, 0x50, 0xdd, 0x54, 0xad, 0xd8, 0xc0, 0x40, + 0x3f, 0x07, 0xd0, 0x72, 0x42, 0xa7, 0x49, 0x94, 0x7b, 0xfa, 0xc8, 0x76, 0x0b, 0xed, 0xc7, 0xb2, + 0xa4, 0xa9, 0xb7, 0xe8, 0xaa, 0x29, 0xc2, 0x06, 0x4b, 0xf4, 0x1c, 0x0c, 0x84, 0xc4, 0x23, 0x4e, + 0xc4, 0x82, 0xa7, 0xd3, 0x99, 0x20, 0x58, 0x83, 0xb0, 0x89, 0x87, 0x9e, 0x50, 0xf1, 0x70, 0xa9, + 0xb8, 0xa0, 0x64, 0x4c, 0x1c, 0x7a, 0xdd, 0x82, 0xe1, 0x75, 0xd7, 0x23, 0x9a, 0xbb, 0xc8, 0xdb, + 0x58, 0x3a, 0xfa, 0x4b, 0x5e, 0x36, 0xe9, 0x6a, 0x09, 0x99, 0x68, 0x8e, 0x70, 0x8a, 0x3d, 0xfd, + 0xcc, 0x5b, 0x24, 0x64, 0xa2, 0xb5, 0x2f, 0xf9, 0x99, 0x6f, 0xf2, 0x66, 0x2c, 0xe1, 0x68, 0x0a, + 0x46, 0x5a, 0x4e, 0x14, 0xcd, 0x84, 0xa4, 0x4e, 0xfc, 0xd8, 0x75, 0x3c, 0x9e, 0x55, 0x51, 0xd1, + 0x51, 0xd5, 0xcb, 0x49, 0x30, 0x4e, 0xe3, 0xa3, 0x0f, 0xc2, 0xc3, 0xdc, 0xff, 0xb3, 0xe8, 0x46, + 0x91, 0xeb, 0x37, 0xf4, 0x34, 0x10, 0x6e, 0xb0, 0x71, 0x41, 0xea, 0xe1, 0xf9, 0x6c, 0x34, 0xdc, + 0xed, 0x79, 0xf4, 0x14, 0x54, 0xa2, 0x4d, 0xb7, 0x35, 0x13, 0xd6, 0x23, 0x76, 0xf6, 0x53, 0xd1, + 0x4e, 0xd7, 0x15, 0xd1, 0x8e, 0x15, 0x06, 0xaa, 0xc1, 0x20, 0xff, 0x24, 0x3c, 0xa0, 0x4f, 0xc8, + 0xc7, 0xa7, 0xbb, 0xaa, 0x69, 0x91, 0x24, 0x38, 0x81, 0x9d, 0x3b, 0x97, 0xe4, 0x49, 0x14, 0x3f, + 0x38, 0xb9, 0x69, 0x90, 0xc1, 0x09, 0xa2, 0xc9, 0x1d, 0xdb, 0x40, 0x0f, 0x3b, 0xb6, 0xe7, 0x60, + 0x60, 0xb3, 0xbd, 0x46, 0xc4, 0xc8, 0x0b, 0xb1, 0xa5, 0x66, 0xdf, 0x35, 0x0d, 0xc2, 0x26, 0x1e, + 0x8b, 0xa5, 0x6c, 0xb9, 0xe2, 0x5f, 0x34, 0x36, 0x64, 0xc4, 0x52, 0x2e, 0xcf, 0xcb, 0x66, 0x6c, + 0xe2, 0xd8, 0xbf, 0x5c, 0x48, 0x3a, 0x25, 0x4c, 0xf9, 0x81, 0x22, 0x2a, 0x25, 0xe2, 0x9b, 0x4e, + 0x28, 0x6d, 0x89, 0x23, 0xe6, 0xa5, 0x08, 0xba, 0x37, 0x9d, 0xd0, 0x94, 0x37, 0x8c, 0x01, 0x96, + 0x9c, 0xd0, 0x6d, 0x28, 0xc5, 0x9e, 0x93, 0x53, 0x22, 0x9b, 0xc1, 0x51, 0xfb, 0x88, 0x16, 0xa6, + 0x22, 0xcc, 0x78, 0xa0, 0x47, 0xe8, 0xc6, 0x68, 0x4d, 0x1e, 0x62, 0x89, 0xbd, 0xcc, 0x5a, 0x84, + 0x59, 0xab, 0xfd, 0x67, 0x03, 0x19, 0x22, 0x5f, 0xe9, 0x58, 0x74, 0x11, 0x80, 0x7e, 0xb1, 0xe5, + 0x90, 0xac, 0xbb, 0xdb, 0xc2, 0xc6, 0x51, 0x62, 0xe5, 0xba, 0x82, 0x60, 0x03, 0x4b, 0x3e, 0xb3, + 0xd2, 0x5e, 0xa7, 0xcf, 0x14, 0x3a, 0x9f, 0xe1, 0x10, 0x6c, 0x60, 0xa1, 0x67, 0xa1, 0xcf, 0x6d, + 0x3a, 0x0d, 0x15, 0x63, 0xfb, 0x08, 0x95, 0x27, 0xf3, 0xac, 0xe5, 0xde, 0xee, 0xf8, 0xb0, 0xea, + 0x10, 0x6b, 0xc2, 0x02, 0x17, 0xfd, 0xba, 0x05, 0x83, 0xb5, 0xa0, 0xd9, 0x0c, 0x7c, 0xbe, 0x33, + 0x15, 0xdb, 0xec, 0xdb, 0xc7, 0x65, 0x81, 0x4c, 0xcc, 0x18, 0xcc, 0xf8, 0x3e, 0x5b, 0x65, 0xdc, + 0x99, 0x20, 0x9c, 0xe8, 0x95, 0x29, 0x76, 0xca, 0xfb, 0x88, 0x9d, 0xdf, 0xb4, 0x60, 0x94, 0x3f, + 0x6b, 0x6c, 0x98, 0x45, 0x72, 0x59, 0x70, 0xcc, 0xaf, 0xd5, 0xe1, 0x43, 0x50, 0x7e, 0xd4, 0x0e, + 0x38, 0xee, 0xec, 0x24, 0x9a, 0x83, 0xd1, 0xf5, 0x20, 0xac, 0x11, 0x73, 0x20, 0x84, 0xcc, 0x54, + 0x84, 0x2e, 0xa7, 0x11, 0x70, 0xe7, 0x33, 0xe8, 0x26, 0x3c, 0x64, 0x34, 0x9a, 0xe3, 0xc0, 0xc5, + 0xe6, 0x63, 0x82, 0xda, 0x43, 0x97, 0x33, 0xb1, 0x70, 0x97, 0xa7, 0x93, 0x12, 0xaa, 0xda, 0x83, + 0x84, 0x7a, 0x05, 0xce, 0xd5, 0x3a, 0x47, 0x66, 0x2b, 0x6a, 0xaf, 0x45, 0x5c, 0x88, 0x56, 0xa6, + 0x7f, 0x44, 0x10, 0x38, 0x37, 0xd3, 0x0d, 0x11, 0x77, 0xa7, 0x81, 0x3e, 0x0a, 0x95, 0x90, 0xb0, + 0xaf, 0x12, 0x89, 0x4c, 0xab, 0x23, 0x3a, 0x12, 0xb4, 0x71, 0xcc, 0xc9, 0x6a, 0xb5, 0x20, 0x1a, + 0x22, 0xac, 0x38, 0xa2, 0x3b, 0xd0, 0xdf, 0x72, 0xe2, 0xda, 0x86, 0xc8, 0xaf, 0x3a, 0xb2, 0xdb, + 0x5b, 0x31, 0x67, 0xa7, 0x14, 0x46, 0x46, 0x36, 0x67, 0x82, 0x25, 0x37, 0x6a, 0x28, 0xd5, 0x82, + 0x66, 0x2b, 0xf0, 0x89, 0x1f, 0x4b, 0x09, 0x3e, 0xcc, 0x8f, 0x12, 0x64, 0x2b, 0x36, 0x30, 0xd0, + 0x32, 0x9c, 0x61, 0x6e, 0xb5, 0x5b, 0x6e, 0xbc, 0x11, 0xb4, 0x63, 0xb9, 0x4b, 0x1c, 0x1b, 0x4e, + 0x1e, 0x26, 0x2d, 0x64, 0xe0, 0xe0, 0xcc, 0x27, 0xd3, 0xba, 0x67, 0xe4, 0x70, 0xba, 0xe7, 0xd4, + 0xfe, 0xba, 0xe7, 0xfc, 0xfb, 0x61, 0xb4, 0x43, 0x68, 0x1c, 0xc8, 0x77, 0x36, 0x0b, 0x0f, 0x65, + 0x2f, 0xcf, 0x03, 0x79, 0xd0, 0xfe, 0x41, 0x2a, 0x84, 0xda, 0xd8, 0x4d, 0xf4, 0xe0, 0x8d, 0x75, + 0xa0, 0x48, 0xfc, 0x2d, 0xa1, 0xad, 0x2e, 0x1f, 0x6d, 0x96, 0x5c, 0xf2, 0xb7, 0xb8, 0x74, 0x61, + 0x2e, 0xa7, 0x4b, 0xfe, 0x16, 0xa6, 0xb4, 0xd1, 0x1b, 0x56, 0xc2, 0x1a, 0xe6, 0x3e, 0xdc, 0x0f, + 0x1f, 0xcb, 0xf6, 0xa9, 0x67, 0x03, 0xd9, 0xfe, 0xd7, 0x05, 0xb8, 0xb0, 0x1f, 0x91, 0x1e, 0x86, + 0xef, 0x71, 0xe8, 0x8b, 0x58, 0x50, 0x84, 0x10, 0xff, 0x03, 0x74, 0x55, 0xf0, 0x30, 0x89, 0x57, + 0xb0, 0x00, 0x21, 0x0f, 0x8a, 0x4d, 0xa7, 0x25, 0x5c, 0x7b, 0xf3, 0x47, 0xcd, 0xc9, 0xa2, 0xff, + 0x1d, 0x6f, 0xd1, 0x69, 0xf1, 0xe9, 0x69, 0x34, 0x60, 0xca, 0x06, 0xc5, 0x50, 0x76, 0xc2, 0xd0, + 0x91, 0x27, 0xf0, 0xd7, 0xf2, 0xe1, 0x37, 0x45, 0x49, 0xf2, 0x03, 0xcc, 0x44, 0x13, 0xe6, 0xcc, + 0xec, 0xcf, 0xf7, 0x27, 0xf2, 0x92, 0x58, 0x58, 0x45, 0x04, 0x7d, 0xc2, 0xa3, 0x67, 0xe5, 0x9d, + 0x0a, 0xc7, 0x13, 0x4b, 0xd9, 0x66, 0x59, 0xa4, 0xe7, 0x0b, 0x56, 0xe8, 0x73, 0x16, 0x4b, 0x82, + 0x97, 0xb9, 0x5a, 0x62, 0x8b, 0x7a, 0x3c, 0x39, 0xf9, 0x66, 0x6a, 0xbd, 0x6c, 0xc4, 0x26, 0x77, + 0x51, 0xcc, 0x82, 0x99, 0xe6, 0x9d, 0xc5, 0x2c, 0x98, 0xa9, 0x2d, 0xe1, 0x68, 0x3b, 0x23, 0x7c, + 0x22, 0x87, 0x44, 0xea, 0x1e, 0x02, 0x26, 0xbe, 0x66, 0xc1, 0xa8, 0x9b, 0x3e, 0x07, 0x17, 0x1b, + 0xba, 0x5b, 0xf9, 0xb8, 0xdf, 0x3a, 0x8f, 0xd9, 0x95, 0xe1, 0xd0, 0x01, 0xc2, 0x9d, 0x9d, 0x41, + 0x75, 0x28, 0xb9, 0xfe, 0x7a, 0x20, 0xcc, 0xa5, 0xe9, 0xa3, 0x75, 0x6a, 0xde, 0x5f, 0x0f, 0xf4, + 0x6a, 0xa6, 0xff, 0x30, 0xa3, 0x8e, 0x16, 0xe0, 0x8c, 0x4c, 0x4d, 0xb9, 0xe2, 0x46, 0x71, 0x10, + 0xee, 0x2c, 0xb8, 0x4d, 0x37, 0x66, 0xa6, 0x4e, 0x71, 0x7a, 0x8c, 0x6a, 0x22, 0x9c, 0x01, 0xc7, + 0x99, 0x4f, 0xa1, 0xd7, 0xa0, 0x5f, 0x9e, 0x3d, 0x57, 0xf2, 0xd8, 0x1c, 0x77, 0xce, 0x7f, 0x35, + 0x99, 0x56, 0xc4, 0xe1, 0xb3, 0x64, 0x68, 0xbf, 0x3e, 0x00, 0x9d, 0x47, 0xe4, 0xc9, 0xf3, 0x70, + 0xeb, 0xa4, 0xcf, 0xc3, 0xe9, 0xd6, 0x28, 0xd2, 0x47, 0xd9, 0x39, 0xcc, 0x6d, 0xc1, 0x55, 0x1f, + 0x53, 0xee, 0xf8, 0x35, 0xcc, 0x78, 0xa0, 0x10, 0xfa, 0x36, 0x88, 0xe3, 0xc5, 0x1b, 0xf9, 0x9c, + 0xa8, 0x5c, 0x61, 0xb4, 0xd2, 0xf9, 0x64, 0xbc, 0x15, 0x0b, 0x4e, 0x68, 0x1b, 0xfa, 0x37, 0xf8, + 0x04, 0x10, 0xbb, 0x95, 0xc5, 0xa3, 0x0e, 0x6e, 0x62, 0x56, 0xe9, 0xcf, 0x2d, 0x1a, 0xb0, 0x64, + 0xc7, 0x62, 0xaf, 0x8c, 0xe8, 0x10, 0xbe, 0x74, 0xf3, 0x4b, 0xa5, 0xeb, 0x3d, 0x34, 0xe4, 0x23, + 0x30, 0x18, 0x92, 0x5a, 0xe0, 0xd7, 0x5c, 0x8f, 0xd4, 0xa7, 0xe4, 0x69, 0xc9, 0x41, 0x32, 0xa8, + 0x98, 0x33, 0x02, 0x1b, 0x34, 0x70, 0x82, 0x22, 0xfa, 0xac, 0x05, 0xc3, 0x2a, 0xfd, 0x98, 0x7e, + 0x10, 0x22, 0xbc, 0xe2, 0x0b, 0x39, 0x25, 0x3b, 0x33, 0x9a, 0xd3, 0xe8, 0xee, 0xee, 0xf8, 0x70, + 0xb2, 0x0d, 0xa7, 0xf8, 0xa2, 0x97, 0x00, 0x82, 0x35, 0x1e, 0x60, 0x35, 0x15, 0x0b, 0x17, 0xf9, + 0x41, 0x5e, 0x75, 0x98, 0x67, 0x62, 0x4a, 0x0a, 0xd8, 0xa0, 0x86, 0xae, 0x01, 0xf0, 0x65, 0xb3, + 0xba, 0xd3, 0x92, 0x5b, 0x1a, 0x99, 0x02, 0x07, 0x2b, 0x0a, 0x72, 0x6f, 0x77, 0xbc, 0xd3, 0x65, + 0xc9, 0xa2, 0x48, 0x8c, 0xc7, 0xd1, 0xcf, 0x42, 0x7f, 0xd4, 0x6e, 0x36, 0x1d, 0xe5, 0x40, 0xcf, + 0x31, 0xb7, 0x93, 0xd3, 0x35, 0x44, 0x11, 0x6f, 0xc0, 0x92, 0x23, 0xba, 0x4d, 0x85, 0x6a, 0x24, + 0x7c, 0xa9, 0x6c, 0x15, 0x71, 0x9b, 0x80, 0x3b, 0x92, 0xde, 0x2d, 0x4d, 0x7c, 0x9c, 0x81, 0x73, + 0x6f, 0x77, 0xfc, 0xa1, 0x64, 0xfb, 0x42, 0x20, 0xb2, 0x2d, 0x33, 0x69, 0xa2, 0xab, 0xb2, 0x88, + 0x0f, 0x7d, 0x6d, 0x59, 0x5b, 0xe2, 0x49, 0x5d, 0xc4, 0x87, 0x35, 0x77, 0x1f, 0x33, 0xf3, 0x61, + 0xb4, 0x08, 0xa7, 0x6b, 0x81, 0x1f, 0x87, 0x81, 0xe7, 0xf1, 0x22, 0x56, 0x7c, 0x77, 0xc9, 0x1d, + 0xec, 0x6f, 0x17, 0xdd, 0x3e, 0x3d, 0xd3, 0x89, 0x82, 0xb3, 0x9e, 0xb3, 0xfd, 0xe4, 0x61, 0x97, + 0x18, 0x9c, 0x67, 0x61, 0x90, 0x6c, 0xc7, 0x24, 0xf4, 0x1d, 0xef, 0x06, 0x5e, 0x90, 0xae, 0x65, + 0xb6, 0x06, 0x2e, 0x19, 0xed, 0x38, 0x81, 0x85, 0x6c, 0xe5, 0x52, 0x31, 0x32, 0x88, 0xb9, 0x4b, + 0x45, 0x3a, 0x50, 0xec, 0xff, 0x5d, 0x48, 0x18, 0x64, 0xf7, 0xe5, 0x68, 0x8d, 0x95, 0x42, 0x91, + 0x35, 0x63, 0x18, 0x40, 0x6c, 0x34, 0xf2, 0xe4, 0xac, 0x4a, 0xa1, 0x2c, 0x99, 0x8c, 0x70, 0x92, + 0x2f, 0xda, 0x84, 0xf2, 0x46, 0x10, 0xc5, 0x72, 0xfb, 0x71, 0xc4, 0x9d, 0xce, 0x95, 0x20, 0x8a, + 0x99, 0x15, 0xa1, 0x5e, 0x9b, 0xb6, 0x44, 0x98, 0xf3, 0xb0, 0xff, 0x93, 0x95, 0x38, 0x48, 0xb8, + 0xc5, 0xa2, 0xb0, 0xb7, 0x88, 0x4f, 0x97, 0xb5, 0x19, 0xf7, 0xf5, 0x93, 0xa9, 0x9c, 0xd6, 0x77, + 0x74, 0xab, 0xd1, 0x76, 0x87, 0x52, 0x98, 0x60, 0x24, 0x8c, 0x10, 0xb1, 0x4f, 0x58, 0xc9, 0xe4, + 0xe4, 0x42, 0x1e, 0x1b, 0x0c, 0x33, 0x41, 0x7f, 0xdf, 0x3c, 0x67, 0xfb, 0x0d, 0x0b, 0xfa, 0xa7, 0x9d, 0xda, 0x66, 0xb0, 0xbe, 0x8e, 0x9e, 0x82, 0x4a, 0xbd, 0x1d, 0x9a, 0x79, 0xd2, 0xca, 0x45, 0x31, 0x2b, 0xda, 0xb1, 0xc2, 0xa0, 0x73, 0x78, 0xdd, 0xa9, 0xc9, 0x34, 0xfd, 0x22, 0x9f, 0xc3, 0x97, 0x59, 0x0b, 0x16, 0x10, 0xba, 0x97, 0x6f, 0x3a, 0xdb, 0xf2, 0xe1, 0xf4, 0x29, 0xc6, 0xa2, @@ -4846,16 +4846,16 @@ var fileDescriptor_030104ce3b95bcac = []byte{ 0xd3, 0x6e, 0xbc, 0xd6, 0xae, 0x6d, 0x92, 0x98, 0xd7, 0x66, 0xa0, 0xbd, 0x6c, 0x47, 0x74, 0x29, 0xa9, 0x7d, 0x9d, 0xea, 0xe5, 0x0d, 0xd1, 0x8e, 0x15, 0x06, 0x7a, 0x0d, 0x06, 0x5a, 0x4e, 0x14, 0xdd, 0x09, 0xc2, 0x3a, 0x26, 0xeb, 0xf9, 0x54, 0x46, 0x59, 0x21, 0xb5, 0x90, 0xc4, 0x98, 0xac, - 0x8b, 0x13, 0x7f, 0x4d, 0x1f, 0x9b, 0xcc, 0xec, 0x5f, 0xb4, 0xe0, 0xcc, 0x34, 0x71, 0x42, 0x12, + 0x8b, 0x13, 0x7f, 0x4d, 0x1f, 0x9b, 0xcc, 0xec, 0x5f, 0xb2, 0xe0, 0xcc, 0x34, 0x71, 0x42, 0x12, 0xb2, 0x42, 0x2a, 0xea, 0x45, 0xd0, 0xab, 0x50, 0x89, 0x69, 0x0b, 0xed, 0x91, 0x95, 0x6f, 0x8f, - 0xd8, 0x59, 0xfd, 0xaa, 0x20, 0x8e, 0x15, 0x1b, 0xfb, 0x4b, 0x16, 0x9c, 0xcb, 0xea, 0xcb, 0x8c, + 0xd8, 0x59, 0xfd, 0xaa, 0x20, 0x8e, 0x15, 0x1b, 0xfb, 0x8b, 0x16, 0x9c, 0xcb, 0xea, 0xcb, 0x8c, 0x17, 0xb4, 0xeb, 0xf7, 0xa3, 0x43, 0x7f, 0xcd, 0x82, 0x41, 0x76, 0xfe, 0x39, 0x4b, 0x62, 0xc7, 0xf5, 0x3a, 0x6a, 0x9f, 0x59, 0x3d, 0xd6, 0x3e, 0xbb, 0x00, 0xa5, 0x8d, 0xa0, 0x49, 0xd2, 0x67, 0xf7, 0x57, 0x02, 0xba, 0xc5, 0xa7, 0x10, 0xf4, 0x0c, 0x9d, 0x84, 0xae, 0x1f, 0x3b, 0x74, 0x39, 0x4a, 0x27, 0xf6, 0x08, 0x9f, 0x80, 0xaa, 0x19, 0x9b, 0x38, 0xf6, 0x3f, 0xad, 0x42, 0xbf, 0x08, 0x34, 0xe9, 0xb9, 0x56, 0x88, 0xf4, 0x35, 0x14, 0xba, 0xfa, 0x1a, 0x22, 0xe8, 0xab, 0xb1, 0x22, 0x8c, 0xc2, 0xa4, 0xbd, 0x96, 0x4b, 0x64, 0x12, 0xaf, 0xeb, 0xa8, 0xbb, 0xc5, 0xff, 0x63, 0xc1, - 0x0a, 0x7d, 0xd9, 0x82, 0x91, 0x5a, 0xe0, 0xfb, 0xa4, 0xa6, 0xed, 0xad, 0x52, 0x1e, 0x01, 0x28, + 0x0a, 0x7d, 0xc9, 0x82, 0x91, 0x5a, 0xe0, 0xfb, 0xa4, 0xa6, 0xed, 0xad, 0x52, 0x1e, 0x01, 0x28, 0x33, 0x49, 0xa2, 0xfa, 0xf0, 0x2d, 0x05, 0xc0, 0x69, 0xf6, 0xe8, 0x05, 0x18, 0xe2, 0x63, 0x76, 0x33, 0xe1, 0x79, 0xd7, 0x25, 0xb1, 0x4c, 0x20, 0x4e, 0xe2, 0xa2, 0x09, 0x7e, 0x82, 0x21, 0x8a, 0x4f, 0xf5, 0x69, 0x07, 0xa5, 0x51, 0x76, 0xca, 0xc0, 0x40, 0x21, 0xa0, 0x90, 0xac, 0x87, 0x24, @@ -4864,67 +4864,67 @@ var fileDescriptor_030104ce3b95bcac = []byte{ 0x68, 0xc3, 0x09, 0xeb, 0xcc, 0xc6, 0x2c, 0xf2, 0x64, 0xb4, 0x15, 0xda, 0x80, 0x79, 0x3b, 0x9a, 0x85, 0x53, 0xa9, 0x82, 0x5e, 0x91, 0xf0, 0x90, 0xab, 0xc4, 0xa3, 0x54, 0x29, 0xb0, 0x08, 0x77, 0x3c, 0x61, 0x3a, 0x42, 0x06, 0xf6, 0x71, 0x84, 0xec, 0xa8, 0x70, 0x4f, 0xee, 0xbb, 0x7e, 0x31, - 0x97, 0x01, 0xe8, 0x29, 0xb6, 0xf3, 0x8b, 0xa9, 0xd8, 0xce, 0x21, 0xd6, 0x81, 0x9b, 0xf9, 0x74, + 0x97, 0x01, 0xe8, 0x29, 0xb6, 0xf3, 0x0b, 0xa9, 0xd8, 0xce, 0x21, 0xd6, 0x81, 0x9b, 0xf9, 0x74, 0xe0, 0xe0, 0x81, 0x9c, 0xf7, 0x33, 0x30, 0xf3, 0x7f, 0x5a, 0x20, 0xbf, 0xeb, 0x8c, 0x53, 0xdb, - 0x20, 0x74, 0xca, 0xa0, 0xf7, 0xc3, 0xb0, 0xda, 0xce, 0xcf, 0x04, 0x6d, 0x9f, 0xc7, 0x64, 0x16, + 0x20, 0x74, 0xca, 0xa0, 0xf7, 0xc1, 0xb0, 0xda, 0xce, 0xcf, 0x04, 0x6d, 0x9f, 0xc7, 0x64, 0x16, 0xf5, 0x29, 0x3d, 0x4e, 0x40, 0x71, 0x0a, 0x1b, 0x4d, 0x42, 0x95, 0x8e, 0x13, 0x7f, 0x94, 0xeb, 0x7d, 0xe5, 0x32, 0x98, 0x5a, 0x9e, 0x17, 0x4f, 0x69, 0x1c, 0x14, 0xc0, 0xa8, 0xe7, 0x44, 0x31, 0xeb, 0x01, 0xdd, 0xdd, 0x1f, 0xb2, 0x2c, 0x07, 0xcb, 0x6e, 0x59, 0x48, 0x13, 0xc2, 0x9d, 0xb4, - 0xed, 0xef, 0x96, 0x60, 0x28, 0x21, 0x19, 0x0f, 0x68, 0x30, 0x3c, 0x05, 0x15, 0xa9, 0xc3, 0xd3, + 0xed, 0xef, 0x94, 0x60, 0x28, 0x21, 0x19, 0x0f, 0x68, 0x30, 0x3c, 0x05, 0x15, 0xa9, 0xc3, 0xd3, 0xf5, 0x87, 0x94, 0xa2, 0x57, 0x18, 0x54, 0x69, 0xad, 0x69, 0xad, 0x9a, 0x36, 0x70, 0x0c, 0x85, 0x8b, 0x4d, 0x3c, 0x26, 0x94, 0x63, 0x2f, 0x9a, 0xf1, 0x5c, 0xe2, 0xc7, 0xbc, 0x9b, 0xf9, 0x08, - 0xe5, 0xd5, 0x85, 0x15, 0x93, 0xa8, 0x16, 0xca, 0x29, 0x00, 0x4e, 0xb3, 0x47, 0x9f, 0xb1, 0x60, + 0xe5, 0xd5, 0x85, 0x15, 0x93, 0xa8, 0x16, 0xca, 0x29, 0x00, 0x4e, 0xb3, 0x47, 0x9f, 0xb6, 0x60, 0xc8, 0xb9, 0x13, 0xe9, 0x4a, 0xc1, 0x22, 0x8a, 0xf3, 0x88, 0x4a, 0x2a, 0x51, 0x7c, 0x98, 0xbb, - 0x9f, 0x13, 0x4d, 0x38, 0xc9, 0x14, 0xbd, 0x61, 0x01, 0x22, 0xdb, 0xa4, 0x26, 0xe3, 0x4c, 0x45, + 0x9f, 0x13, 0x4d, 0x38, 0xc9, 0x14, 0xbd, 0x69, 0x01, 0x22, 0xdb, 0xa4, 0x26, 0xe3, 0x4c, 0x45, 0x5f, 0xfa, 0xf2, 0xd8, 0xf5, 0x5e, 0xea, 0xa0, 0xcb, 0xa5, 0x7a, 0x67, 0x3b, 0xce, 0xe8, 0x83, 0xfd, 0x8f, 0x8b, 0x6a, 0x41, 0xe9, 0xd0, 0x66, 0xc7, 0x08, 0xb1, 0xb4, 0x0e, 0x1f, 0x62, 0xa9, - 0x43, 0x44, 0x3a, 0xb3, 0x7d, 0x13, 0xc9, 0x81, 0x85, 0xfb, 0x94, 0x1c, 0xf8, 0x73, 0x56, 0xa2, + 0x43, 0x44, 0x3a, 0xb3, 0x7d, 0x13, 0xc9, 0x81, 0x85, 0xfb, 0x94, 0x1c, 0xf8, 0xf3, 0x56, 0xa2, 0xd2, 0xd6, 0xc0, 0xc5, 0x97, 0xf2, 0x0d, 0xab, 0x9e, 0xe0, 0xe1, 0x2b, 0x29, 0xe9, 0x9e, 0x8c, 0x5a, 0xa2, 0xd2, 0xd4, 0x40, 0x3b, 0x90, 0x34, 0xfc, 0xb7, 0x45, 0x18, 0x30, 0x34, 0x69, 0xa6, - 0x59, 0x64, 0x3d, 0x60, 0x66, 0x51, 0xe1, 0x00, 0x66, 0xd1, 0xcf, 0x42, 0xb5, 0x26, 0xa5, 0x7c, + 0x59, 0x64, 0x3d, 0x60, 0x66, 0x51, 0xe1, 0x00, 0x66, 0xd1, 0xcf, 0x41, 0xb5, 0x26, 0xa5, 0x7c, 0x3e, 0xb5, 0xa6, 0xd3, 0xba, 0x43, 0x0b, 0x7a, 0xd5, 0x84, 0x35, 0x4f, 0x34, 0x97, 0x48, 0x29, 0x13, 0x1a, 0xa2, 0xc4, 0x34, 0x44, 0x56, 0xce, 0x97, 0xd0, 0x14, 0x9d, 0xcf, 0xa4, 0x0f, 0x72, - 0xcb, 0x3d, 0x04, 0x11, 0x7d, 0xd7, 0x52, 0x1f, 0xf7, 0x04, 0x6a, 0x87, 0xdc, 0x4e, 0xd6, 0x0e, + 0xcb, 0x3d, 0x04, 0x11, 0x7d, 0xc7, 0x52, 0x1f, 0xf7, 0x04, 0x6a, 0x87, 0xdc, 0x4e, 0xd6, 0x0e, 0xb9, 0x94, 0xcb, 0x30, 0x77, 0x29, 0x1a, 0x72, 0x1d, 0xfa, 0x67, 0x82, 0x66, 0xd3, 0xf1, 0xeb, 0xe8, 0xc7, 0xa0, 0xbf, 0xc6, 0x7f, 0x0a, 0x27, 0x13, 0x3b, 0xaa, 0x14, 0x50, 0x2c, 0x61, 0xe8, 0x11, 0x28, 0x39, 0x61, 0x43, 0x3a, 0x96, 0x58, 0x48, 0xd1, 0x54, 0xd8, 0x88, 0x30, 0x6b, 0xb5, 0xff, 0x7e, 0x09, 0xd8, 0x49, 0xbe, 0x13, 0x92, 0xfa, 0x6a, 0xc0, 0x6a, 0x5d, 0x1e, 0xeb, 0x01, 0x9f, 0xde, 0x2c, 0x3d, 0xc8, 0x87, 0x7c, 0xc6, 0x41, 0x4f, 0xf1, 0x84, 0x0f, 0x7a, 0xba, 0x9c, - 0xdd, 0x95, 0x1e, 0xa0, 0xb3, 0x3b, 0xfb, 0x0b, 0x16, 0x20, 0x15, 0xfe, 0xa1, 0x0f, 0xd7, 0x27, + 0xdd, 0x95, 0x1e, 0xa0, 0xb3, 0x3b, 0xfb, 0xf3, 0x16, 0x20, 0x15, 0xfe, 0xa1, 0x0f, 0xd7, 0x27, 0xa1, 0xaa, 0x02, 0x41, 0x84, 0x61, 0xa5, 0x45, 0x84, 0x04, 0x60, 0x8d, 0xd3, 0xc3, 0x0e, 0xf9, - 0x71, 0x29, 0xbf, 0x8b, 0xc9, 0x40, 0x69, 0x26, 0xf5, 0x85, 0x38, 0xb7, 0x7f, 0xa7, 0x00, 0x0f, + 0x71, 0x29, 0xbf, 0x8b, 0xc9, 0x40, 0x69, 0x26, 0xf5, 0x85, 0x38, 0xb7, 0x7f, 0xb7, 0x00, 0x0f, 0x71, 0x95, 0xbc, 0xe8, 0xf8, 0x4e, 0x83, 0x34, 0x69, 0xaf, 0x7a, 0x0d, 0x97, 0xa8, 0xd1, 0xad, 0x99, 0x2b, 0x03, 0x9f, 0x8f, 0xba, 0x76, 0xf9, 0x9a, 0xe3, 0xab, 0x6c, 0xde, 0x77, 0x63, 0xcc, 0x88, 0xa3, 0x08, 0x2a, 0xf2, 0x22, 0x06, 0x21, 0x8b, 0x73, 0x62, 0xa4, 0xc4, 0x92, 0xd0, 0x9b, 0x04, 0x2b, 0x46, 0xd4, 0x70, 0xf5, 0x82, 0xda, 0x26, 0x26, 0xad, 0x80, 0xc9, 0x5d, 0x23, 0xee, 0x74, 0x41, 0xb4, 0x63, 0x85, 0x61, 0x37, 0x61, 0x44, 0x8e, 0x61, 0xeb, 0x1a, 0xd9, 0xc1, 0x64, 0x9d, 0xea, 0x9f, 0x9a, 0x6c, 0x32, 0xee, 0x86, 0x50, 0xfa, 0x67, 0xc6, 0x04, 0xe2, 0x24, 0xae, - 0xac, 0xea, 0x59, 0xc8, 0xae, 0xea, 0x69, 0xff, 0x8e, 0x05, 0x69, 0x05, 0x68, 0xd4, 0x30, 0xb4, - 0xf6, 0xac, 0x61, 0x78, 0x80, 0x2a, 0x80, 0x3f, 0x0d, 0x03, 0x4e, 0x4c, 0x6d, 0x16, 0xbe, 0xcb, + 0xac, 0xea, 0x59, 0xc8, 0xae, 0xea, 0x69, 0xff, 0xae, 0x05, 0x69, 0x05, 0x68, 0xd4, 0x30, 0xb4, + 0xf6, 0xac, 0x61, 0x78, 0x80, 0x2a, 0x80, 0x3f, 0x03, 0x03, 0x4e, 0x4c, 0x6d, 0x16, 0xbe, 0xcb, 0x2f, 0x1e, 0xee, 0x44, 0x67, 0x31, 0xa8, 0xbb, 0xeb, 0x2e, 0xdb, 0xdd, 0x9b, 0xe4, 0xec, 0xff, 0x5e, 0x82, 0xd1, 0x8e, 0xac, 0x24, 0xf4, 0x3c, 0x0c, 0xaa, 0xa1, 0x90, 0xfe, 0xb3, 0xaa, 0x19, 0x7b, 0xa8, 0x61, 0x38, 0x81, 0xd9, 0xc3, 0x7a, 0x98, 0x87, 0xd3, 0x21, 0x79, 0xb5, 0x4d, 0xda, 0x64, 0x6a, 0x3d, 0x26, 0xe1, 0x0a, 0xa9, 0x05, 0x7e, 0x9d, 0x57, 0xda, 0x2c, 0x4e, 0x3f, 0x7c, 0x77, 0x77, 0xfc, 0x34, 0xee, 0x04, 0xe3, 0xac, 0x67, 0x50, 0x0b, 0x86, 0x3c, 0xd3, 0xe4, 0x14, 0xfb, 0x8d, 0x43, 0x59, 0xab, 0x6a, 0x4a, 0x24, 0x9a, 0x71, 0x92, 0x41, 0xd2, 0x6e, 0x2d, 0xdf, - 0x27, 0xbb, 0xf5, 0xd3, 0xda, 0x6e, 0xe5, 0xa1, 0x07, 0x1f, 0xce, 0x39, 0x2b, 0xed, 0xb8, 0x0d, + 0x27, 0xbb, 0xf5, 0x53, 0xda, 0x6e, 0xe5, 0xa1, 0x07, 0x1f, 0xca, 0x39, 0x2b, 0xed, 0xb8, 0x0d, 0xd7, 0x17, 0xa1, 0x22, 0xc3, 0xb2, 0x7a, 0x0a, 0x67, 0x32, 0xe9, 0x74, 0x11, 0xa0, 0x4f, 0xc0, 0x8f, 0x5e, 0x0a, 0x43, 0x63, 0x30, 0xaf, 0x07, 0xf1, 0x94, 0xe7, 0x05, 0x77, 0xa8, 0x4d, 0x70, 0x23, 0x22, 0xc2, 0xa1, 0x63, 0xdf, 0x2b, 0x40, 0xc6, 0xde, 0x88, 0xae, 0x47, 0x6d, 0x88, 0x24, - 0xd6, 0xe3, 0xc1, 0x8c, 0x11, 0xb4, 0xcd, 0x43, 0xd7, 0xb8, 0xca, 0xfd, 0x50, 0xde, 0x7b, 0x3b, + 0xd6, 0xe3, 0xc1, 0x8c, 0x11, 0xb4, 0xcd, 0x43, 0xd7, 0xb8, 0xca, 0xfd, 0x60, 0xde, 0x7b, 0x3b, 0x1d, 0xcd, 0xa6, 0xc4, 0x91, 0x8a, 0x68, 0xbb, 0x08, 0xa0, 0xed, 0x47, 0x91, 0x2a, 0xa1, 0x4e, 0xc6, 0xb5, 0x99, 0x89, 0x0d, 0x2c, 0xba, 0xd5, 0x77, 0xfd, 0x28, 0x76, 0x3c, 0xef, 0x8a, 0xeb, - 0xc7, 0xc2, 0x67, 0xa9, 0x6c, 0x8b, 0x79, 0x0d, 0xc2, 0x26, 0xde, 0xf9, 0xf7, 0x18, 0xdf, 0xef, + 0xc7, 0xc2, 0x67, 0xa9, 0x6c, 0x8b, 0x79, 0x0d, 0xc2, 0x26, 0xde, 0xf9, 0x77, 0x1b, 0xdf, 0xef, 0x20, 0xdf, 0x7d, 0x03, 0xce, 0xcd, 0xb9, 0xb1, 0x4a, 0xf0, 0x51, 0xf3, 0x8d, 0x9a, 0x87, 0x2a, 0x61, 0xcd, 0xea, 0x9a, 0xb0, 0x66, 0x24, 0xd8, 0x14, 0x92, 0xf9, 0x40, 0xe9, 0x04, 0x1b, 0xfb, - 0x79, 0x38, 0x33, 0xe7, 0xc6, 0x97, 0x5d, 0x8f, 0x1c, 0x90, 0x89, 0xfd, 0xdb, 0x7d, 0x30, 0x68, - 0xa6, 0xaa, 0x1e, 0x24, 0xe7, 0xee, 0x4b, 0xd4, 0x02, 0x14, 0x6f, 0xe7, 0xaa, 0x73, 0xc5, 0x5b, + 0x79, 0x38, 0x33, 0xe7, 0xc6, 0x97, 0x5d, 0x8f, 0x1c, 0x90, 0x89, 0xfd, 0x3b, 0x7d, 0x30, 0x68, + 0xa6, 0xaa, 0x1e, 0x24, 0xe7, 0xee, 0x8b, 0xd4, 0x02, 0x14, 0x6f, 0xe7, 0xaa, 0x73, 0xc5, 0x5b, 0x47, 0xce, 0x9b, 0xcd, 0x1e, 0x31, 0xc3, 0x08, 0xd4, 0x3c, 0xb1, 0xd9, 0x01, 0x74, 0x07, 0xca, 0xeb, 0x2c, 0x01, 0xa4, 0x98, 0x47, 0xf0, 0x45, 0xd6, 0x88, 0xea, 0xe5, 0xc8, 0x53, 0x48, 0x38, 0x3f, 0xaa, 0xb8, 0xc3, 0x64, 0x56, 0xa1, 0x11, 0x19, 0x2c, 0xf2, 0x09, 0x15, 0x46, 0x37, 0x95, 0x50, 0x3e, 0x84, 0x4a, 0x48, 0x08, 0xe8, 0xbe, 0xfb, 0x24, 0xa0, 0x59, 0x32, 0x4f, 0xbc, 0xc1, 0xcc, 0x4a, 0x91, 0xca, 0xd0, 0xcf, 0x06, 0xc1, 0x48, 0xe6, 0x49, 0x80, 0x71, 0x1a, 0x1f, 0x7d, - 0x42, 0x89, 0xf8, 0x4a, 0x1e, 0xee, 0x5e, 0x73, 0x46, 0x1f, 0xb7, 0x74, 0xff, 0x42, 0x01, 0x86, + 0x5c, 0x89, 0xf8, 0x4a, 0x1e, 0xee, 0x5e, 0x73, 0x46, 0x1f, 0xb7, 0x74, 0xff, 0x7c, 0x01, 0x86, 0xe7, 0xfc, 0xf6, 0xf2, 0xdc, 0x72, 0x7b, 0xcd, 0x73, 0x6b, 0xd7, 0xc8, 0x0e, 0x15, 0xe1, 0x9b, 0x64, 0x67, 0x7e, 0x56, 0xac, 0x20, 0x35, 0x67, 0xae, 0xd1, 0x46, 0xcc, 0x61, 0x54, 0x18, 0xad, 0xbb, 0x7e, 0x83, 0x84, 0xad, 0xd0, 0x15, 0x9e, 0x58, 0x43, 0x18, 0x5d, 0xd6, 0x20, 0x6c, 0xe2, @@ -4932,125 +4932,125 @@ var fileDescriptor_030104ce3b95bcac = []byte{ 0xd8, 0x8e, 0x62, 0x31, 0x19, 0x15, 0xd2, 0x2a, 0x6d, 0xc4, 0x1c, 0x46, 0x57, 0x7a, 0xd4, 0x5e, 0x63, 0xb1, 0x2d, 0xa9, 0xbc, 0x89, 0x15, 0xde, 0x8c, 0x25, 0x9c, 0xa2, 0x6e, 0x92, 0x9d, 0x59, 0xba, 0x19, 0x4f, 0x65, 0x76, 0x5d, 0xe3, 0xcd, 0x58, 0xc2, 0x59, 0x2d, 0xd0, 0xe4, 0x70, 0xfc, - 0xc0, 0xd5, 0x02, 0x4d, 0x76, 0xbf, 0xcb, 0xb6, 0xfe, 0x57, 0x2d, 0x18, 0x34, 0x23, 0xd2, 0x50, - 0x23, 0x65, 0x0b, 0x2f, 0x75, 0x94, 0x92, 0x7e, 0x5f, 0xd6, 0x35, 0x7e, 0x0d, 0x37, 0x0e, 0x5a, + 0xc0, 0xd5, 0x02, 0x4d, 0x76, 0xbf, 0xcb, 0xb6, 0xfe, 0xd7, 0x2c, 0x18, 0x34, 0x23, 0xd2, 0x50, + 0x23, 0x65, 0x0b, 0x2f, 0x75, 0x94, 0x92, 0x7e, 0x6f, 0xd6, 0x35, 0x7e, 0x0d, 0x37, 0x0e, 0x5a, 0xd1, 0xd3, 0xc4, 0x6f, 0xb8, 0x3e, 0x61, 0x81, 0x06, 0x3c, 0x92, 0x2d, 0x11, 0xee, 0x36, 0x13, 0xd4, 0xc9, 0x21, 0x8c, 0x69, 0xfb, 0x16, 0x8c, 0x76, 0xa4, 0xf3, 0xf5, 0x60, 0x82, 0xec, 0x9b, 0x4c, 0x6d, 0x63, 0x18, 0xa0, 0x84, 0x65, 0x3d, 0xaa, 0x19, 0x18, 0xe5, 0x0b, 0x89, 0x72, 0x5a, 0xa9, 0x6d, 0x90, 0xa6, 0x4a, 0xd1, 0x64, 0x6e, 0xff, 0x9b, 0x69, 0x20, 0xee, 0xc4, 0xb7, 0xbf, - 0x68, 0xc1, 0x50, 0x22, 0xc3, 0x32, 0x27, 0x63, 0x89, 0xad, 0xb4, 0x80, 0x05, 0x48, 0xb2, 0x28, - 0xf1, 0x22, 0x53, 0xa6, 0x7a, 0xa5, 0x69, 0x10, 0x36, 0xf1, 0xec, 0xaf, 0x14, 0xa0, 0x22, 0x83, - 0x4c, 0x7a, 0xe8, 0xca, 0xe7, 0x2d, 0x18, 0x52, 0x47, 0x2d, 0xcc, 0x87, 0x57, 0xc8, 0x23, 0xe7, - 0x84, 0xf6, 0x40, 0x79, 0x01, 0xfc, 0xf5, 0x40, 0x5b, 0xee, 0xd8, 0x64, 0x86, 0x93, 0xbc, 0xd1, - 0x4d, 0x80, 0x68, 0x27, 0x8a, 0x49, 0xd3, 0xf0, 0x26, 0xda, 0xc6, 0x8a, 0x9b, 0xa8, 0x05, 0x21, - 0xa1, 0xeb, 0xeb, 0x7a, 0x50, 0x27, 0x2b, 0x0a, 0x53, 0x9b, 0x50, 0xba, 0x0d, 0x1b, 0x94, 0xec, - 0xbf, 0x5b, 0x80, 0x53, 0xe9, 0x2e, 0xa1, 0x0f, 0xc3, 0xa0, 0xe4, 0x6e, 0xec, 0x3a, 0x65, 0x64, - 0xcd, 0x20, 0x36, 0x60, 0xf7, 0x76, 0xc7, 0xc7, 0x3b, 0xaf, 0x84, 0x9c, 0x30, 0x51, 0x70, 0x82, - 0x18, 0x3f, 0xef, 0x12, 0x07, 0xb3, 0xd3, 0x3b, 0x53, 0xad, 0x96, 0x38, 0xb4, 0x32, 0xce, 0xbb, - 0x4c, 0x28, 0x4e, 0x61, 0xa3, 0x65, 0x38, 0x63, 0xb4, 0x5c, 0x27, 0x6e, 0x63, 0x63, 0x2d, 0x08, - 0xe5, 0x0e, 0xec, 0x11, 0x1d, 0xfb, 0xd6, 0x89, 0x83, 0x33, 0x9f, 0xa4, 0xda, 0xbe, 0xe6, 0xb4, - 0x9c, 0x9a, 0x1b, 0xef, 0x08, 0xf7, 0xa8, 0x92, 0x4d, 0x33, 0xa2, 0x1d, 0x2b, 0x0c, 0x7b, 0x11, - 0x4a, 0x3d, 0xce, 0xa0, 0x9e, 0x2c, 0xff, 0x17, 0xa1, 0x42, 0xc9, 0x49, 0xf3, 0x2e, 0x0f, 0x92, - 0x01, 0x54, 0xe4, 0x4d, 0x41, 0xc8, 0x86, 0xa2, 0xeb, 0xc8, 0x23, 0x45, 0xf5, 0x5a, 0xf3, 0x51, - 0xd4, 0x66, 0x9b, 0x69, 0x0a, 0x44, 0x8f, 0x43, 0x91, 0x6c, 0xb7, 0xd2, 0x67, 0x87, 0x97, 0xb6, - 0x5b, 0x6e, 0x48, 0x22, 0x8a, 0x44, 0xb6, 0x5b, 0xe8, 0x3c, 0x14, 0xdc, 0xba, 0x50, 0x52, 0x20, - 0x70, 0x0a, 0xf3, 0xb3, 0xb8, 0xe0, 0xd6, 0xed, 0x6d, 0xa8, 0xaa, 0xab, 0x89, 0xd0, 0xa6, 0x94, - 0xdd, 0x56, 0x1e, 0x51, 0x61, 0x92, 0x6e, 0x17, 0xa9, 0xdd, 0x06, 0xd0, 0xf9, 0x9c, 0x79, 0xc9, - 0x97, 0x0b, 0x50, 0xaa, 0x05, 0x22, 0x0d, 0xbe, 0xa2, 0xc9, 0x30, 0xa1, 0xcd, 0x20, 0xf6, 0x2d, - 0x18, 0xbe, 0xe6, 0x07, 0x77, 0xd8, 0xc5, 0x08, 0xac, 0x0e, 0x20, 0x25, 0xbc, 0x4e, 0x7f, 0xa4, - 0x4d, 0x04, 0x06, 0xc5, 0x1c, 0xa6, 0x2a, 0x94, 0x15, 0xba, 0x55, 0x28, 0xb3, 0x3f, 0x69, 0xc1, - 0xa0, 0x4a, 0x0c, 0x9b, 0xdb, 0xda, 0xa4, 0x74, 0x1b, 0x61, 0xd0, 0x6e, 0xa5, 0xe9, 0xb2, 0xcb, - 0xc3, 0x30, 0x87, 0x99, 0x19, 0x93, 0x85, 0x7d, 0x32, 0x26, 0x2f, 0x40, 0x69, 0xd3, 0xf5, 0xeb, - 0xe9, 0xdb, 0x70, 0xae, 0xb9, 0x7e, 0x1d, 0x33, 0x08, 0xed, 0xc2, 0x29, 0xd5, 0x05, 0xa9, 0x10, - 0x9e, 0x87, 0xc1, 0xb5, 0xb6, 0xeb, 0xd5, 0x65, 0x81, 0xc3, 0x94, 0x47, 0x65, 0xda, 0x80, 0xe1, - 0x04, 0x26, 0xdd, 0xd7, 0xad, 0xb9, 0xbe, 0x13, 0xee, 0x2c, 0x6b, 0x0d, 0xa4, 0x84, 0xd2, 0xb4, - 0x82, 0x60, 0x03, 0xcb, 0x7e, 0xbd, 0x08, 0xc3, 0xc9, 0xf4, 0xb8, 0x1e, 0xb6, 0x57, 0x8f, 0x43, - 0x99, 0x65, 0xcc, 0xa5, 0x3f, 0x2d, 0xaf, 0x09, 0xc8, 0x61, 0x28, 0x82, 0x3e, 0x5e, 0x06, 0x24, - 0x9f, 0x9b, 0xa4, 0x54, 0x27, 0x95, 0x1f, 0x86, 0x85, 0xdc, 0x89, 0xca, 0x23, 0x82, 0x15, 0xfa, - 0x8c, 0x05, 0xfd, 0x41, 0xcb, 0xac, 0x6c, 0xf5, 0xa1, 0x3c, 0x53, 0x07, 0x45, 0x3e, 0x91, 0xb0, - 0x88, 0xd5, 0xa7, 0x97, 0x9f, 0x43, 0xb2, 0x3e, 0xff, 0x5e, 0x18, 0x34, 0x31, 0xf7, 0x33, 0x8a, - 0x2b, 0xa6, 0x51, 0xfc, 0x79, 0x73, 0x52, 0x88, 0xe4, 0xc8, 0x1e, 0x96, 0xdb, 0x0d, 0x28, 0xd7, - 0x54, 0x5c, 0xc2, 0xa1, 0xca, 0xe2, 0xaa, 0xba, 0x1c, 0xec, 0x6c, 0x8a, 0x53, 0xb3, 0xbf, 0x6b, - 0x19, 0xf3, 0x03, 0x93, 0x68, 0xbe, 0x8e, 0x42, 0x28, 0x36, 0xb6, 0x36, 0x85, 0x29, 0x7a, 0x35, - 0xa7, 0xe1, 0x9d, 0xdb, 0xda, 0xd4, 0x73, 0xdc, 0x6c, 0xc5, 0x94, 0x59, 0x0f, 0xce, 0xc2, 0x44, - 0x0e, 0x6d, 0x71, 0xff, 0x1c, 0x5a, 0xfb, 0x8d, 0x02, 0x8c, 0x76, 0x4c, 0x2a, 0xf4, 0x1a, 0x94, - 0x43, 0xfa, 0x96, 0xe2, 0xf5, 0x16, 0x72, 0xcb, 0x7a, 0x8d, 0xe6, 0xeb, 0x5a, 0xef, 0x26, 0xdb, - 0x31, 0x67, 0x89, 0xae, 0x02, 0xd2, 0xd1, 0x33, 0xca, 0x53, 0xc9, 0x5f, 0xf9, 0xbc, 0x78, 0x14, - 0x4d, 0x75, 0x60, 0xe0, 0x8c, 0xa7, 0xd0, 0x0b, 0x69, 0x87, 0x67, 0x31, 0xe9, 0xce, 0xde, 0xcb, - 0x77, 0x69, 0xff, 0x93, 0x02, 0x0c, 0x25, 0x0a, 0x8d, 0x21, 0x0f, 0x2a, 0xc4, 0x63, 0x67, 0x0d, - 0x52, 0xd9, 0x1c, 0xb5, 0x6c, 0xb8, 0x52, 0x90, 0x97, 0x04, 0x5d, 0xac, 0x38, 0x3c, 0x18, 0x67, - 0xfe, 0xcf, 0xc3, 0xa0, 0xec, 0xd0, 0x87, 0x9c, 0xa6, 0x27, 0x06, 0x50, 0xcd, 0xd1, 0x4b, 0x06, - 0x0c, 0x27, 0x30, 0xed, 0xdf, 0x2d, 0xc2, 0x18, 0x3f, 0x9c, 0xa9, 0xab, 0x99, 0xb7, 0x28, 0xf7, - 0x5b, 0x7f, 0x49, 0x97, 0x03, 0xe4, 0x03, 0xb9, 0x76, 0xd4, 0x5b, 0x3a, 0xb2, 0x19, 0xf5, 0x14, - 0x30, 0xf6, 0xf5, 0x54, 0xc0, 0x18, 0x37, 0xbb, 0x1b, 0xc7, 0xd4, 0xa3, 0x1f, 0xac, 0x08, 0xb2, - 0xbf, 0x5d, 0x80, 0x91, 0xd4, 0x15, 0x28, 0xe8, 0xf5, 0x64, 0xd5, 0x6c, 0x2b, 0x0f, 0x9f, 0xfa, - 0x9e, 0xb7, 0x62, 0x1c, 0xac, 0x76, 0xf6, 0x7d, 0x5a, 0x2a, 0xf6, 0x1f, 0x16, 0x60, 0x38, 0x79, - 0x77, 0xcb, 0x03, 0x38, 0x52, 0xef, 0x82, 0x2a, 0xbb, 0x9e, 0x80, 0x5d, 0x69, 0xcb, 0x5d, 0xf2, - 0xbc, 0x12, 0xbc, 0x6c, 0xc4, 0x1a, 0xfe, 0x40, 0x94, 0x24, 0xb7, 0xff, 0x8e, 0x05, 0x67, 0xf9, - 0x5b, 0xa6, 0xe7, 0xe1, 0x5f, 0xce, 0x1a, 0xdd, 0x97, 0xf3, 0xed, 0x60, 0xaa, 0x8c, 0xe5, 0x7e, - 0xe3, 0xcb, 0xae, 0xd2, 0x14, 0xbd, 0x4d, 0x4e, 0x85, 0x07, 0xb0, 0xb3, 0x07, 0x9a, 0x0c, 0xf6, - 0x1f, 0x16, 0x41, 0xdf, 0x1e, 0x8a, 0x5c, 0x91, 0x06, 0x9a, 0x4b, 0x39, 0xcf, 0x95, 0x1d, 0xbf, - 0xa6, 0xef, 0x29, 0xad, 0xa4, 0xb2, 0x40, 0x7f, 0xc1, 0x82, 0x01, 0xd7, 0x77, 0x63, 0xd7, 0x61, - 0xdb, 0xe8, 0x7c, 0x6e, 0x36, 0x54, 0xec, 0xe6, 0x39, 0xe5, 0x20, 0x34, 0xcf, 0x71, 0x14, 0x33, - 0x6c, 0x72, 0x46, 0x1f, 0x15, 0x31, 0xdd, 0xc5, 0xdc, 0x12, 0x98, 0x2b, 0xa9, 0x40, 0xee, 0x16, - 0x35, 0xbc, 0xe2, 0x30, 0xa7, 0xbc, 0x7f, 0x4c, 0x49, 0xa9, 0xca, 0xd0, 0xfa, 0x1e, 0x77, 0xda, - 0x8c, 0x39, 0x23, 0x3b, 0x02, 0xd4, 0x39, 0x16, 0x07, 0x8c, 0x97, 0x9d, 0x84, 0xaa, 0xd3, 0x8e, - 0x83, 0x26, 0x1d, 0x26, 0x71, 0xd4, 0xa4, 0x23, 0x82, 0x25, 0x00, 0x6b, 0x1c, 0xfb, 0xf5, 0x32, - 0xa4, 0xf2, 0x32, 0xd1, 0xb6, 0x79, 0xf3, 0xad, 0x95, 0xef, 0xcd, 0xb7, 0xaa, 0x33, 0x59, 0xb7, - 0xdf, 0xa2, 0x06, 0x94, 0x5b, 0x1b, 0x4e, 0x24, 0xcd, 0xea, 0x17, 0xd5, 0x3e, 0x8e, 0x36, 0xde, - 0xdb, 0x1d, 0xff, 0xa9, 0xde, 0xbc, 0xae, 0x74, 0xae, 0x4e, 0xf2, 0x5a, 0x32, 0x9a, 0x35, 0xa3, - 0x81, 0x39, 0xfd, 0x83, 0xdc, 0xed, 0xf8, 0x29, 0x71, 0x0f, 0x03, 0x26, 0x51, 0xdb, 0x8b, 0xc5, - 0x6c, 0x78, 0x31, 0xc7, 0x55, 0xc6, 0x09, 0xeb, 0x8a, 0x02, 0xfc, 0x3f, 0x36, 0x98, 0xa2, 0x0f, - 0x43, 0x35, 0x8a, 0x9d, 0x30, 0x3e, 0x64, 0x0e, 0xb0, 0x1a, 0xf4, 0x15, 0x49, 0x04, 0x6b, 0x7a, - 0xe8, 0x25, 0x56, 0xdd, 0xd8, 0x8d, 0x36, 0x0e, 0x99, 0x8a, 0x21, 0x2b, 0x21, 0x0b, 0x0a, 0xd8, - 0xa0, 0x86, 0x2e, 0x02, 0xb0, 0xb9, 0xcd, 0xe3, 0x0f, 0x2b, 0xcc, 0xcb, 0xa4, 0x44, 0x21, 0x56, - 0x10, 0x6c, 0x60, 0xd9, 0x3f, 0x0e, 0xc9, 0x92, 0x18, 0x68, 0x5c, 0x56, 0xe0, 0xe0, 0x5e, 0x68, - 0x96, 0x52, 0x91, 0x28, 0x96, 0xf1, 0x1b, 0x16, 0x98, 0x75, 0x3b, 0xd0, 0xab, 0xbc, 0x40, 0x88, - 0x95, 0xc7, 0xc9, 0xa1, 0x41, 0x77, 0x62, 0xd1, 0x69, 0xa5, 0x8e, 0xb0, 0x65, 0x95, 0x90, 0xf3, - 0xef, 0x81, 0x8a, 0x84, 0x1e, 0xc8, 0xa8, 0xfb, 0x04, 0x9c, 0x96, 0x79, 0x96, 0xd2, 0x6f, 0x2a, - 0x4e, 0x9d, 0xf6, 0x77, 0xfd, 0x48, 0x7f, 0x4e, 0xa1, 0x9b, 0x3f, 0xa7, 0x87, 0xfb, 0x8f, 0x7f, - 0xd3, 0x82, 0x0b, 0xe9, 0x0e, 0x44, 0x8b, 0x81, 0xef, 0xc6, 0x41, 0xb8, 0x42, 0xe2, 0xd8, 0xf5, - 0x1b, 0xac, 0x2e, 0xda, 0x1d, 0x27, 0x94, 0x65, 0xe7, 0x99, 0xa0, 0xbc, 0xe5, 0x84, 0x3e, 0x66, - 0xad, 0x68, 0x07, 0xfa, 0x78, 0x90, 0x9a, 0xb0, 0xd6, 0x8f, 0xb8, 0x36, 0x32, 0x86, 0x43, 0x6f, - 0x17, 0x78, 0x80, 0x1c, 0x16, 0x0c, 0xed, 0xef, 0x59, 0x80, 0x96, 0xb6, 0x48, 0x18, 0xba, 0x75, - 0x23, 0xac, 0x8e, 0xdd, 0x67, 0x64, 0xdc, 0x5b, 0x64, 0x66, 0x01, 0xa7, 0xee, 0x33, 0x32, 0xfe, - 0x65, 0xdf, 0x67, 0x54, 0x38, 0xd8, 0x7d, 0x46, 0x68, 0x09, 0xce, 0x36, 0xf9, 0x76, 0x83, 0xdf, - 0x11, 0xc2, 0xf7, 0x1e, 0x2a, 0xcf, 0xed, 0xdc, 0xdd, 0xdd, 0xf1, 0xb3, 0x8b, 0x59, 0x08, 0x38, - 0xfb, 0x39, 0xfb, 0x3d, 0x80, 0x78, 0x34, 0xdd, 0x4c, 0x56, 0xac, 0x52, 0x57, 0xf7, 0x8b, 0xfd, - 0xb5, 0x32, 0x8c, 0xa4, 0x8a, 0x12, 0xd3, 0xad, 0x5e, 0x67, 0x70, 0xd4, 0x91, 0xf5, 0x77, 0x67, - 0xf7, 0x7a, 0x0a, 0xb7, 0xf2, 0xa1, 0xec, 0xfa, 0xad, 0x76, 0x9c, 0x4f, 0x9a, 0x2d, 0xef, 0xc4, - 0x3c, 0x25, 0x68, 0xb8, 0x8b, 0xe9, 0x5f, 0xcc, 0xd9, 0xe4, 0x19, 0xbc, 0x95, 0x30, 0xc6, 0x4b, - 0xf7, 0xc9, 0x1d, 0xf0, 0x29, 0x1d, 0x4a, 0x55, 0xce, 0xc3, 0xb1, 0x98, 0x9a, 0x2c, 0xc7, 0x7d, - 0xd4, 0xfe, 0xad, 0x02, 0x0c, 0x18, 0x1f, 0x0d, 0xfd, 0x4a, 0xb2, 0xaa, 0x95, 0x95, 0xdf, 0x2b, - 0x31, 0xfa, 0x13, 0xba, 0x6e, 0x15, 0x7f, 0xa5, 0x27, 0x3a, 0x0b, 0x5a, 0xdd, 0xdb, 0x1d, 0x3f, - 0x95, 0x2a, 0x59, 0x95, 0x28, 0x72, 0x75, 0xfe, 0xe3, 0x30, 0x92, 0x22, 0x93, 0xf1, 0xca, 0xab, - 0xe6, 0x2b, 0x1f, 0xd9, 0x2d, 0x65, 0x0e, 0xd9, 0x9b, 0x74, 0xc8, 0x44, 0x76, 0x5f, 0xe0, 0x91, + 0x60, 0xc1, 0x50, 0x22, 0xc3, 0x32, 0x27, 0x63, 0x89, 0xad, 0xb4, 0x80, 0x05, 0x48, 0xb2, 0x28, + 0xf1, 0x22, 0x53, 0xa6, 0x7a, 0xa5, 0x69, 0x10, 0x36, 0xf1, 0xec, 0x37, 0x0a, 0x50, 0x91, 0x41, + 0x26, 0x3d, 0x74, 0xe5, 0x73, 0x16, 0x0c, 0xa9, 0xa3, 0x16, 0xe6, 0xc3, 0x2b, 0xe4, 0x91, 0x73, + 0x42, 0x7b, 0xa0, 0xbc, 0x00, 0xfe, 0x7a, 0xa0, 0x2d, 0x77, 0x6c, 0x32, 0xc3, 0x49, 0xde, 0xe8, + 0x26, 0x40, 0xb4, 0x13, 0xc5, 0xa4, 0x69, 0x78, 0x13, 0x6d, 0x63, 0xc5, 0x4d, 0xd4, 0x82, 0x90, + 0xd0, 0xf5, 0x75, 0x3d, 0xa8, 0x93, 0x15, 0x85, 0xa9, 0x4d, 0x28, 0xdd, 0x86, 0x0d, 0x4a, 0xf6, + 0xdf, 0x2d, 0xc0, 0xa9, 0x74, 0x97, 0xd0, 0x87, 0x60, 0x50, 0x72, 0x37, 0x76, 0x9d, 0x32, 0xb2, + 0x66, 0x10, 0x1b, 0xb0, 0x7b, 0xbb, 0xe3, 0xe3, 0x9d, 0x57, 0x42, 0x4e, 0x98, 0x28, 0x38, 0x41, + 0x8c, 0x9f, 0x77, 0x89, 0x83, 0xd9, 0xe9, 0x9d, 0xa9, 0x56, 0x4b, 0x1c, 0x5a, 0x19, 0xe7, 0x5d, + 0x26, 0x14, 0xa7, 0xb0, 0xd1, 0x32, 0x9c, 0x31, 0x5a, 0xae, 0x13, 0xb7, 0xb1, 0xb1, 0x16, 0x84, + 0x72, 0x07, 0xf6, 0x88, 0x8e, 0x7d, 0xeb, 0xc4, 0xc1, 0x99, 0x4f, 0x52, 0x6d, 0x5f, 0x73, 0x5a, + 0x4e, 0xcd, 0x8d, 0x77, 0x84, 0x7b, 0x54, 0xc9, 0xa6, 0x19, 0xd1, 0x8e, 0x15, 0x86, 0xbd, 0x08, + 0xa5, 0x1e, 0x67, 0x50, 0x4f, 0x96, 0xff, 0x8b, 0x50, 0xa1, 0xe4, 0xa4, 0x79, 0x97, 0x07, 0xc9, + 0x00, 0x2a, 0xf2, 0xa6, 0x20, 0x64, 0x43, 0xd1, 0x75, 0xe4, 0x91, 0xa2, 0x7a, 0xad, 0xf9, 0x28, + 0x6a, 0xb3, 0xcd, 0x34, 0x05, 0xa2, 0xc7, 0xa1, 0x48, 0xb6, 0x5b, 0xe9, 0xb3, 0xc3, 0x4b, 0xdb, + 0x2d, 0x37, 0x24, 0x11, 0x45, 0x22, 0xdb, 0x2d, 0x74, 0x1e, 0x0a, 0x6e, 0x5d, 0x28, 0x29, 0x10, + 0x38, 0x85, 0xf9, 0x59, 0x5c, 0x70, 0xeb, 0xf6, 0x36, 0x54, 0xd5, 0xd5, 0x44, 0x68, 0x53, 0xca, + 0x6e, 0x2b, 0x8f, 0xa8, 0x30, 0x49, 0xb7, 0x8b, 0xd4, 0x6e, 0x03, 0xe8, 0x7c, 0xce, 0xbc, 0xe4, + 0xcb, 0x05, 0x28, 0xd5, 0x02, 0x91, 0x06, 0x5f, 0xd1, 0x64, 0x98, 0xd0, 0x66, 0x10, 0xfb, 0x16, + 0x0c, 0x5f, 0xf3, 0x83, 0x3b, 0xec, 0x62, 0x04, 0x56, 0x07, 0x90, 0x12, 0x5e, 0xa7, 0x3f, 0xd2, + 0x26, 0x02, 0x83, 0x62, 0x0e, 0x53, 0x15, 0xca, 0x0a, 0xdd, 0x2a, 0x94, 0xd9, 0x9f, 0xb0, 0x60, + 0x50, 0x25, 0x86, 0xcd, 0x6d, 0x6d, 0x52, 0xba, 0x8d, 0x30, 0x68, 0xb7, 0xd2, 0x74, 0xd9, 0xe5, + 0x61, 0x98, 0xc3, 0xcc, 0x8c, 0xc9, 0xc2, 0x3e, 0x19, 0x93, 0x17, 0xa0, 0xb4, 0xe9, 0xfa, 0xf5, + 0xf4, 0x6d, 0x38, 0xd7, 0x5c, 0xbf, 0x8e, 0x19, 0x84, 0x76, 0xe1, 0x94, 0xea, 0x82, 0x54, 0x08, + 0xcf, 0xc3, 0xe0, 0x5a, 0xdb, 0xf5, 0xea, 0xb2, 0xc0, 0x61, 0xca, 0xa3, 0x32, 0x6d, 0xc0, 0x70, + 0x02, 0x93, 0xee, 0xeb, 0xd6, 0x5c, 0xdf, 0x09, 0x77, 0x96, 0xb5, 0x06, 0x52, 0x42, 0x69, 0x5a, + 0x41, 0xb0, 0x81, 0x65, 0xbf, 0x5e, 0x84, 0xe1, 0x64, 0x7a, 0x5c, 0x0f, 0xdb, 0xab, 0xc7, 0xa1, + 0xcc, 0x32, 0xe6, 0xd2, 0x9f, 0x96, 0xd7, 0x04, 0xe4, 0x30, 0x14, 0x41, 0x1f, 0x2f, 0x03, 0x92, + 0xcf, 0x4d, 0x52, 0xaa, 0x93, 0xca, 0x0f, 0xc3, 0x42, 0xee, 0x44, 0xe5, 0x11, 0xc1, 0x0a, 0x7d, + 0xda, 0x82, 0xfe, 0xa0, 0x65, 0x56, 0xb6, 0xfa, 0x60, 0x9e, 0xa9, 0x83, 0x22, 0x9f, 0x48, 0x58, + 0xc4, 0xea, 0xd3, 0xcb, 0xcf, 0x21, 0x59, 0x9f, 0x7f, 0x0f, 0x0c, 0x9a, 0x98, 0xfb, 0x19, 0xc5, + 0x15, 0xd3, 0x28, 0xfe, 0x9c, 0x39, 0x29, 0x44, 0x72, 0x64, 0x0f, 0xcb, 0xed, 0x06, 0x94, 0x6b, + 0x2a, 0x2e, 0xe1, 0x50, 0x65, 0x71, 0x55, 0x5d, 0x0e, 0x76, 0x36, 0xc5, 0xa9, 0xd9, 0xdf, 0xb1, + 0x8c, 0xf9, 0x81, 0x49, 0x34, 0x5f, 0x47, 0x21, 0x14, 0x1b, 0x5b, 0x9b, 0xc2, 0x14, 0xbd, 0x9a, + 0xd3, 0xf0, 0xce, 0x6d, 0x6d, 0xea, 0x39, 0x6e, 0xb6, 0x62, 0xca, 0xac, 0x07, 0x67, 0x61, 0x22, + 0x87, 0xb6, 0xb8, 0x7f, 0x0e, 0xad, 0xfd, 0x66, 0x01, 0x46, 0x3b, 0x26, 0x15, 0x7a, 0x0d, 0xca, + 0x21, 0x7d, 0x4b, 0xf1, 0x7a, 0x0b, 0xb9, 0x65, 0xbd, 0x46, 0xf3, 0x75, 0xad, 0x77, 0x93, 0xed, + 0x98, 0xb3, 0x44, 0x57, 0x01, 0xe9, 0xe8, 0x19, 0xe5, 0xa9, 0xe4, 0xaf, 0x7c, 0x5e, 0x3c, 0x8a, + 0xa6, 0x3a, 0x30, 0x70, 0xc6, 0x53, 0xe8, 0x85, 0xb4, 0xc3, 0xb3, 0x98, 0x74, 0x67, 0xef, 0xe5, + 0xbb, 0xb4, 0xff, 0x49, 0x01, 0x86, 0x12, 0x85, 0xc6, 0x90, 0x07, 0x15, 0xe2, 0xb1, 0xb3, 0x06, + 0xa9, 0x6c, 0x8e, 0x5a, 0x36, 0x5c, 0x29, 0xc8, 0x4b, 0x82, 0x2e, 0x56, 0x1c, 0x1e, 0x8c, 0x33, + 0xff, 0xe7, 0x61, 0x50, 0x76, 0xe8, 0x83, 0x4e, 0xd3, 0x13, 0x03, 0xa8, 0xe6, 0xe8, 0x25, 0x03, + 0x86, 0x13, 0x98, 0xf6, 0xef, 0x15, 0x61, 0x8c, 0x1f, 0xce, 0xd4, 0xd5, 0xcc, 0x5b, 0x94, 0xfb, + 0xad, 0xbf, 0xa4, 0xcb, 0x01, 0xf2, 0x81, 0x5c, 0x3b, 0xea, 0x2d, 0x1d, 0xd9, 0x8c, 0x7a, 0x0a, + 0x18, 0xfb, 0x6a, 0x2a, 0x60, 0x8c, 0x9b, 0xdd, 0x8d, 0x63, 0xea, 0xd1, 0x0f, 0x56, 0x04, 0xd9, + 0xdf, 0x2e, 0xc0, 0x48, 0xea, 0x0a, 0x14, 0xf4, 0x7a, 0xb2, 0x6a, 0xb6, 0x95, 0x87, 0x4f, 0x7d, + 0xcf, 0x5b, 0x31, 0x0e, 0x56, 0x3b, 0xfb, 0x3e, 0x2d, 0x15, 0xfb, 0x8f, 0x0a, 0x30, 0x9c, 0xbc, + 0xbb, 0xe5, 0x01, 0x1c, 0xa9, 0x77, 0x42, 0x95, 0x5d, 0x4f, 0xc0, 0xae, 0xb4, 0xe5, 0x2e, 0x79, + 0x5e, 0x09, 0x5e, 0x36, 0x62, 0x0d, 0x7f, 0x20, 0x4a, 0x92, 0xdb, 0x7f, 0xc7, 0x82, 0xb3, 0xfc, + 0x2d, 0xd3, 0xf3, 0xf0, 0x2f, 0x67, 0x8d, 0xee, 0xcb, 0xf9, 0x76, 0x30, 0x55, 0xc6, 0x72, 0xbf, + 0xf1, 0x65, 0x57, 0x69, 0x8a, 0xde, 0x26, 0xa7, 0xc2, 0x03, 0xd8, 0xd9, 0x03, 0x4d, 0x06, 0xfb, + 0x8f, 0x8a, 0xa0, 0x6f, 0x0f, 0x45, 0xae, 0x48, 0x03, 0xcd, 0xa5, 0x9c, 0xe7, 0xca, 0x8e, 0x5f, + 0xd3, 0xf7, 0x94, 0x56, 0x52, 0x59, 0xa0, 0xbf, 0x68, 0xc1, 0x80, 0xeb, 0xbb, 0xb1, 0xeb, 0xb0, + 0x6d, 0x74, 0x3e, 0x37, 0x1b, 0x2a, 0x76, 0xf3, 0x9c, 0x72, 0x10, 0x9a, 0xe7, 0x38, 0x8a, 0x19, + 0x36, 0x39, 0xa3, 0x8f, 0x88, 0x98, 0xee, 0x62, 0x6e, 0x09, 0xcc, 0x95, 0x54, 0x20, 0x77, 0x8b, + 0x1a, 0x5e, 0x71, 0x98, 0x53, 0xde, 0x3f, 0xa6, 0xa4, 0x54, 0x65, 0x68, 0x7d, 0x8f, 0x3b, 0x6d, + 0xc6, 0x9c, 0x91, 0x1d, 0x01, 0xea, 0x1c, 0x8b, 0x03, 0xc6, 0xcb, 0x4e, 0x42, 0xd5, 0x69, 0xc7, + 0x41, 0x93, 0x0e, 0x93, 0x38, 0x6a, 0xd2, 0x11, 0xc1, 0x12, 0x80, 0x35, 0x8e, 0xfd, 0x7a, 0x19, + 0x52, 0x79, 0x99, 0x68, 0xdb, 0xbc, 0xf9, 0xd6, 0xca, 0xf7, 0xe6, 0x5b, 0xd5, 0x99, 0xac, 0xdb, + 0x6f, 0x51, 0x03, 0xca, 0xad, 0x0d, 0x27, 0x92, 0x66, 0xf5, 0x8b, 0x6a, 0x1f, 0x47, 0x1b, 0xef, + 0xed, 0x8e, 0xff, 0x74, 0x6f, 0x5e, 0x57, 0x3a, 0x57, 0x27, 0x79, 0x2d, 0x19, 0xcd, 0x9a, 0xd1, + 0xc0, 0x9c, 0xfe, 0x41, 0xee, 0x76, 0xfc, 0xa4, 0xb8, 0x87, 0x01, 0x93, 0xa8, 0xed, 0xc5, 0x62, + 0x36, 0xbc, 0x98, 0xe3, 0x2a, 0xe3, 0x84, 0x75, 0x45, 0x01, 0xfe, 0x1f, 0x1b, 0x4c, 0xd1, 0x87, + 0xa0, 0x1a, 0xc5, 0x4e, 0x18, 0x1f, 0x32, 0x07, 0x58, 0x0d, 0xfa, 0x8a, 0x24, 0x82, 0x35, 0x3d, + 0xf4, 0x12, 0xab, 0x6e, 0xec, 0x46, 0x1b, 0x87, 0x4c, 0xc5, 0x90, 0x95, 0x90, 0x05, 0x05, 0x6c, + 0x50, 0x43, 0x17, 0x01, 0xd8, 0xdc, 0xe6, 0xf1, 0x87, 0x15, 0xe6, 0x65, 0x52, 0xa2, 0x10, 0x2b, + 0x08, 0x36, 0xb0, 0xec, 0x9f, 0x80, 0x64, 0x49, 0x0c, 0x34, 0x2e, 0x2b, 0x70, 0x70, 0x2f, 0x34, + 0x4b, 0xa9, 0x48, 0x14, 0xcb, 0xf8, 0x4d, 0x0b, 0xcc, 0xba, 0x1d, 0xe8, 0x55, 0x5e, 0x20, 0xc4, + 0xca, 0xe3, 0xe4, 0xd0, 0xa0, 0x3b, 0xb1, 0xe8, 0xb4, 0x52, 0x47, 0xd8, 0xb2, 0x4a, 0xc8, 0xf9, + 0x77, 0x43, 0x45, 0x42, 0x0f, 0x64, 0xd4, 0x7d, 0x1c, 0x4e, 0xcb, 0x3c, 0x4b, 0xe9, 0x37, 0x15, + 0xa7, 0x4e, 0xfb, 0xbb, 0x7e, 0xa4, 0x3f, 0xa7, 0xd0, 0xcd, 0x9f, 0xd3, 0xc3, 0xfd, 0xc7, 0xbf, + 0x65, 0xc1, 0x85, 0x74, 0x07, 0xa2, 0xc5, 0xc0, 0x77, 0xe3, 0x20, 0x5c, 0x21, 0x71, 0xec, 0xfa, + 0x0d, 0x56, 0x17, 0xed, 0x8e, 0x13, 0xca, 0xb2, 0xf3, 0x4c, 0x50, 0xde, 0x72, 0x42, 0x1f, 0xb3, + 0x56, 0xb4, 0x03, 0x7d, 0x3c, 0x48, 0x4d, 0x58, 0xeb, 0x47, 0x5c, 0x1b, 0x19, 0xc3, 0xa1, 0xb7, + 0x0b, 0x3c, 0x40, 0x0e, 0x0b, 0x86, 0xf6, 0xf7, 0x2c, 0x40, 0x4b, 0x5b, 0x24, 0x0c, 0xdd, 0xba, + 0x11, 0x56, 0xc7, 0xee, 0x33, 0x32, 0xee, 0x2d, 0x32, 0xb3, 0x80, 0x53, 0xf7, 0x19, 0x19, 0xff, + 0xb2, 0xef, 0x33, 0x2a, 0x1c, 0xec, 0x3e, 0x23, 0xb4, 0x04, 0x67, 0x9b, 0x7c, 0xbb, 0xc1, 0xef, + 0x08, 0xe1, 0x7b, 0x0f, 0x95, 0xe7, 0x76, 0xee, 0xee, 0xee, 0xf8, 0xd9, 0xc5, 0x2c, 0x04, 0x9c, + 0xfd, 0x9c, 0xfd, 0x6e, 0x40, 0x3c, 0x9a, 0x6e, 0x26, 0x2b, 0x56, 0xa9, 0xab, 0xfb, 0xc5, 0xfe, + 0x4a, 0x19, 0x46, 0x52, 0x45, 0x89, 0xe9, 0x56, 0xaf, 0x33, 0x38, 0xea, 0xc8, 0xfa, 0xbb, 0xb3, + 0x7b, 0x3d, 0x85, 0x5b, 0xf9, 0x50, 0x76, 0xfd, 0x56, 0x3b, 0xce, 0x27, 0xcd, 0x96, 0x77, 0x62, + 0x9e, 0x12, 0x34, 0xdc, 0xc5, 0xf4, 0x2f, 0xe6, 0x6c, 0xf2, 0x0c, 0xde, 0x4a, 0x18, 0xe3, 0xa5, + 0xfb, 0xe4, 0x0e, 0xf8, 0xa4, 0x0e, 0xa5, 0x2a, 0xe7, 0xe1, 0x58, 0x4c, 0x4d, 0x96, 0xe3, 0x3e, + 0x6a, 0xff, 0x66, 0x01, 0x06, 0x8c, 0x8f, 0x86, 0x7e, 0x35, 0x59, 0xd5, 0xca, 0xca, 0xef, 0x95, + 0x18, 0xfd, 0x09, 0x5d, 0xb7, 0x8a, 0xbf, 0xd2, 0x13, 0x9d, 0x05, 0xad, 0xee, 0xed, 0x8e, 0x9f, + 0x4a, 0x95, 0xac, 0x4a, 0x14, 0xb9, 0x3a, 0xff, 0x31, 0x18, 0x49, 0x91, 0xc9, 0x78, 0xe5, 0x55, + 0xf3, 0x95, 0x8f, 0xec, 0x96, 0x32, 0x87, 0xec, 0x1b, 0x74, 0xc8, 0x44, 0x76, 0x5f, 0xe0, 0x91, 0x1e, 0x7c, 0xb0, 0xa9, 0x24, 0xde, 0x42, 0x8f, 0x49, 0xbc, 0x4f, 0x42, 0xa5, 0x15, 0x78, 0x6e, 0xcd, 0x55, 0x45, 0x26, 0x59, 0xda, 0xf0, 0xb2, 0x68, 0xc3, 0x0a, 0x8a, 0xee, 0x40, 0xf5, 0xf6, 0x9d, 0x98, 0x9f, 0xfe, 0x08, 0xff, 0x76, 0x5e, 0x87, 0x3e, 0xca, 0x68, 0x51, 0xc7, 0x4b, 0x58, 0xf3, 0x42, 0x36, 0xf4, 0x31, 0x25, 0x28, 0x33, 0x12, 0x98, 0xef, 0x9d, 0x69, 0xc7, 0x08, 0x0b, - 0x88, 0xfd, 0xcd, 0x2a, 0x9c, 0xc9, 0xaa, 0x0c, 0x8f, 0x3e, 0x06, 0x7d, 0xbc, 0x8f, 0xf9, 0x5c, + 0x88, 0xfd, 0xf5, 0x2a, 0x9c, 0xc9, 0xaa, 0x0c, 0x8f, 0x3e, 0x0a, 0x7d, 0xbc, 0x8f, 0xf9, 0x5c, 0x3e, 0x92, 0xc5, 0x63, 0x8e, 0x11, 0x14, 0xdd, 0x62, 0xbf, 0xb1, 0xe0, 0x29, 0xb8, 0x7b, 0xce, 0x9a, 0x98, 0x21, 0xc7, 0xc3, 0x7d, 0xc1, 0xd1, 0xdc, 0x17, 0x1c, 0xce, 0xdd, 0x73, 0xd6, 0xd0, 0x36, 0x94, 0x1b, 0x6e, 0x4c, 0x1c, 0xe1, 0x44, 0xb8, 0x75, 0x2c, 0xcc, 0x89, 0xc3, 0xad, 0x34, - 0xf6, 0x13, 0x73, 0x86, 0xe8, 0x1b, 0x16, 0x8c, 0xac, 0x25, 0xab, 0x07, 0x08, 0xe1, 0xe9, 0x1c, - 0x43, 0xf5, 0xff, 0x24, 0x23, 0x7e, 0xa1, 0x57, 0xaa, 0x11, 0xa7, 0xbb, 0x83, 0x3e, 0x6d, 0x41, + 0xf6, 0x13, 0x73, 0x86, 0xe8, 0x6b, 0x16, 0x8c, 0xac, 0x25, 0xab, 0x07, 0x08, 0xe1, 0xe9, 0x1c, + 0x43, 0xf5, 0xff, 0x24, 0x23, 0x7e, 0xa1, 0x57, 0xaa, 0x11, 0xa7, 0xbb, 0x83, 0x3e, 0x65, 0x41, 0xff, 0xba, 0xeb, 0x19, 0x05, 0x98, 0x8f, 0xe1, 0xe3, 0x5c, 0x66, 0x0c, 0xf4, 0x8e, 0x83, 0xff, - 0x8f, 0xb0, 0xe4, 0xdc, 0x4d, 0x53, 0xf5, 0x1d, 0x55, 0x53, 0xf5, 0xdf, 0x27, 0x4d, 0xf5, 0x39, - 0x0b, 0xaa, 0x6a, 0xa4, 0x45, 0x16, 0xf6, 0x87, 0x8f, 0xf1, 0x93, 0x73, 0xcf, 0x89, 0xfa, 0x8b, - 0x35, 0x73, 0xf4, 0x65, 0x0b, 0x06, 0x9c, 0xd7, 0xda, 0x21, 0xa9, 0x93, 0xad, 0xa0, 0x15, 0x89, + 0x8f, 0xb0, 0xe4, 0xdc, 0x4d, 0x53, 0xf5, 0x1d, 0x55, 0x53, 0xf5, 0xdf, 0x27, 0x4d, 0xf5, 0x59, + 0x0b, 0xaa, 0x6a, 0xa4, 0x45, 0x16, 0xf6, 0x87, 0x8e, 0xf1, 0x93, 0x73, 0xcf, 0x89, 0xfa, 0x8b, + 0x35, 0x73, 0xf4, 0x25, 0x0b, 0x06, 0x9c, 0xd7, 0xda, 0x21, 0xa9, 0x93, 0xad, 0xa0, 0x15, 0x89, 0xdb, 0x40, 0x5f, 0xce, 0xbf, 0x33, 0x53, 0x94, 0xc9, 0x2c, 0xd9, 0x5a, 0x6a, 0x45, 0x22, 0x5b, 0x4a, 0x37, 0x60, 0xb3, 0x0b, 0xf6, 0x6e, 0x01, 0xc6, 0xf7, 0xa1, 0x80, 0x9e, 0x87, 0xc1, 0x20, 0x6c, 0x38, 0xbe, 0xfb, 0x9a, 0x59, 0x0e, 0x44, 0x59, 0x59, 0x4b, 0x06, 0x0c, 0x27, 0x30, 0xcd, 0x3c, 0xf1, 0xc2, 0x3e, 0x79, 0xe2, 0x17, 0xa0, 0x14, 0x92, 0x56, 0x90, 0xde, 0x2c, 0xb0, 0x4c, 0x05, 0x06, 0x41, 0x8f, 0x42, 0xd1, 0x69, 0xb9, 0x22, 0x10, 0x4d, 0xed, 0x81, 0xa6, 0x96, 0xe7, 0x31, 0x6d, 0x4f, 0x94, 0xad, 0x28, 0x9f, 0x48, 0xd9, 0x0a, 0xaa, 0x06, 0xc4, 0xd9, 0x45, 0x9f, - 0x56, 0x03, 0xc9, 0x33, 0x05, 0xfb, 0x8d, 0x22, 0x3c, 0xba, 0xe7, 0x7c, 0xd1, 0x71, 0x78, 0xd6, - 0x1e, 0x71, 0x78, 0x72, 0x78, 0x0a, 0xfb, 0x0d, 0x4f, 0xb1, 0xcb, 0xf0, 0x7c, 0x9a, 0x2e, 0x03, + 0x56, 0x03, 0xc9, 0x33, 0x05, 0xfb, 0xcd, 0x22, 0x3c, 0xba, 0xe7, 0x7c, 0xd1, 0x71, 0x78, 0xd6, + 0x1e, 0x71, 0x78, 0x72, 0x78, 0x0a, 0xfb, 0x0d, 0x4f, 0xb1, 0xcb, 0xf0, 0x7c, 0x8a, 0x2e, 0x03, 0x59, 0x46, 0x25, 0x9f, 0xfb, 0x1c, 0xbb, 0x55, 0x65, 0x11, 0x2b, 0x40, 0x42, 0xb1, 0xe6, 0x4b, 0xf7, 0x00, 0x89, 0x1c, 0xe9, 0x72, 0x1e, 0x6a, 0xa0, 0x6b, 0x29, 0x13, 0x3e, 0xf7, 0xbb, 0x25, - 0x5e, 0xdb, 0xbf, 0x55, 0x82, 0xc7, 0x7b, 0x90, 0xde, 0xe6, 0x2c, 0xb6, 0x7a, 0x9c, 0xc5, 0x3f, - 0xe0, 0x9f, 0xe9, 0xb3, 0x99, 0x9f, 0x09, 0xe7, 0xff, 0x99, 0xf6, 0xfe, 0x42, 0xe8, 0x29, 0xa8, + 0x5e, 0xdb, 0xbf, 0x5d, 0x82, 0xc7, 0x7b, 0x90, 0xde, 0xe6, 0x2c, 0xb6, 0x7a, 0x9c, 0xc5, 0x3f, + 0xe0, 0x9f, 0xe9, 0x33, 0x99, 0x9f, 0x09, 0xe7, 0xff, 0x99, 0xf6, 0xfe, 0x42, 0xe8, 0x29, 0xa8, 0xb8, 0x7e, 0x44, 0x6a, 0xed, 0x90, 0xc7, 0x24, 0x1b, 0x69, 0x4c, 0xf3, 0xa2, 0x1d, 0x2b, 0x0c, 0xba, 0xa7, 0xab, 0x39, 0x74, 0xf9, 0xf7, 0xe7, 0x94, 0xbb, 0x6b, 0x66, 0x44, 0x71, 0x93, 0x62, 0x66, 0x8a, 0x4a, 0x00, 0xce, 0xc6, 0xfe, 0x2b, 0x16, 0x9c, 0xef, 0xae, 0x62, 0xd1, 0x33, 0x30, @@ -5059,214 +5059,215 @@ var fileDescriptor_030104ce3b95bcac = []byte{ 0xd3, 0x40, 0xdc, 0x89, 0x6f, 0x7f, 0xbf, 0x98, 0xdd, 0x2d, 0x6e, 0x8a, 0x1d, 0x64, 0x36, 0x8b, 0xb9, 0x5a, 0xe8, 0x41, 0xe2, 0x16, 0x4f, 0x5a, 0xe2, 0x96, 0xba, 0x49, 0x5c, 0x34, 0x0b, 0xa7, 0x8c, 0xab, 0x96, 0x78, 0x36, 0x37, 0x0f, 0x4b, 0x56, 0x25, 0x4e, 0x96, 0x53, 0x70, 0xdc, 0xf1, - 0xc4, 0x03, 0x3e, 0xf5, 0x7e, 0xb5, 0x00, 0xe7, 0xba, 0x5a, 0xbf, 0x27, 0xa4, 0x51, 0xcc, 0xcf, - 0x5f, 0x3a, 0x99, 0xcf, 0x6f, 0x7e, 0x94, 0xf2, 0x7e, 0x1f, 0xc5, 0xfe, 0xa3, 0x42, 0xd7, 0x85, + 0xc4, 0x03, 0x3e, 0xf5, 0x7e, 0xad, 0x00, 0xe7, 0xba, 0x5a, 0xbf, 0x27, 0xa4, 0x51, 0xcc, 0xcf, + 0x5f, 0x3a, 0x99, 0xcf, 0x6f, 0x7e, 0x94, 0xf2, 0x7e, 0x1f, 0xc5, 0xfe, 0xe3, 0x42, 0xd7, 0x85, 0x40, 0x77, 0x42, 0x3f, 0xb4, 0xa3, 0xf4, 0x02, 0x0c, 0x39, 0xad, 0x16, 0xc7, 0x63, 0x51, 0xb4, 0xa9, 0x92, 0x4a, 0x53, 0x26, 0x10, 0x27, 0x71, 0x7b, 0xb2, 0x69, 0xfe, 0xc4, 0x82, 0x2a, 0x26, 0xeb, 0x5c, 0x1a, 0xa1, 0xdb, 0x62, 0x88, 0xac, 0x3c, 0x0a, 0xc1, 0xd2, 0x81, 0x8d, 0x5c, 0x56, 0x20, 0x35, 0x6b, 0xb0, 0x3b, 0xaf, 0xde, 0x2a, 0x1c, 0xe8, 0xea, 0x2d, 0x75, 0xf9, 0x52, 0xb1, - 0xfb, 0xe5, 0x4b, 0xf6, 0x9b, 0xfd, 0xf4, 0xf5, 0x5a, 0xc1, 0x4c, 0x48, 0xea, 0x11, 0xfd, 0xbe, - 0xed, 0xd0, 0x13, 0x93, 0x44, 0x7d, 0xdf, 0x1b, 0x78, 0x01, 0xd3, 0xf6, 0xc4, 0x01, 0x59, 0xe1, - 0x40, 0x05, 0x65, 0x8a, 0xfb, 0x16, 0x94, 0x79, 0x01, 0x86, 0xa2, 0x68, 0x63, 0x39, 0x74, 0xb7, - 0x9c, 0x98, 0x5c, 0x23, 0x3b, 0xc2, 0xf6, 0xd5, 0x45, 0x20, 0x56, 0xae, 0x68, 0x20, 0x4e, 0xe2, - 0xa2, 0x39, 0x18, 0xd5, 0x65, 0x5d, 0x48, 0x18, 0xb3, 0x9c, 0x0b, 0x3e, 0x13, 0x54, 0xc6, 0xb7, - 0x2e, 0x04, 0x23, 0x10, 0x70, 0xe7, 0x33, 0x54, 0x9e, 0x26, 0x1a, 0x69, 0x47, 0xfa, 0x92, 0xf2, - 0x34, 0x41, 0x87, 0xf6, 0xa5, 0xe3, 0x09, 0xb4, 0x08, 0xa7, 0xf9, 0xc4, 0x98, 0x6a, 0xb5, 0x8c, - 0x37, 0xea, 0x4f, 0x16, 0xe0, 0x9c, 0xeb, 0x44, 0xc1, 0x59, 0xcf, 0xa1, 0xe7, 0x60, 0x40, 0x35, - 0xcf, 0xcf, 0x8a, 0xb3, 0x1d, 0xe5, 0x5b, 0x52, 0x64, 0xe6, 0xeb, 0xd8, 0xc4, 0x43, 0x1f, 0x82, - 0x87, 0xf5, 0x5f, 0x9e, 0x98, 0xc7, 0x0f, 0x3c, 0x67, 0x45, 0xc5, 0x2c, 0x75, 0xd5, 0xcf, 0x5c, - 0x26, 0x5a, 0x1d, 0x77, 0x7b, 0x1e, 0xad, 0xc1, 0x79, 0x05, 0xba, 0xe4, 0xc7, 0x2c, 0xcb, 0x26, - 0x22, 0xd3, 0x4e, 0x44, 0x6e, 0x84, 0x9e, 0xb8, 0x32, 0x5a, 0xdd, 0x06, 0x3b, 0xe7, 0xc6, 0x57, - 0xb2, 0x30, 0xf1, 0x02, 0xde, 0x83, 0x0a, 0x9a, 0x84, 0x2a, 0xf1, 0x9d, 0x35, 0x8f, 0x2c, 0xcd, - 0xcc, 0xb3, 0xca, 0x5b, 0xc6, 0xf9, 0xea, 0x25, 0x09, 0xc0, 0x1a, 0x47, 0xc5, 0xfd, 0x0e, 0x76, - 0xbd, 0x99, 0x78, 0x19, 0xce, 0x34, 0x6a, 0x2d, 0x6a, 0x11, 0xba, 0x35, 0x32, 0x55, 0x63, 0x61, - 0x8e, 0xf4, 0xc3, 0xf0, 0xca, 0xa8, 0x2a, 0xa8, 0x7d, 0x6e, 0x66, 0xb9, 0x03, 0x07, 0x67, 0x3e, - 0xc9, 0xc2, 0x61, 0xc3, 0x60, 0x7b, 0x67, 0xec, 0x74, 0x2a, 0x1c, 0x96, 0x36, 0x62, 0x0e, 0x43, - 0x57, 0x01, 0xb1, 0x0c, 0x89, 0x2b, 0x71, 0xdc, 0x52, 0x26, 0xe8, 0xd8, 0x19, 0xf6, 0x4a, 0x2a, - 0xb8, 0xef, 0x72, 0x07, 0x06, 0xce, 0x78, 0xca, 0xfe, 0x77, 0x16, 0x0c, 0xa9, 0xf5, 0x7a, 0x02, - 0x39, 0x42, 0x5e, 0x32, 0x47, 0x68, 0xee, 0xe8, 0x12, 0x8f, 0xf5, 0xbc, 0x4b, 0xa0, 0xf9, 0x67, - 0x07, 0x00, 0xb4, 0x54, 0x54, 0x0a, 0xc9, 0xea, 0xaa, 0x90, 0x1e, 0x58, 0x89, 0x94, 0x55, 0x66, - 0xa7, 0x7c, 0x7f, 0xcb, 0xec, 0xac, 0xc0, 0x59, 0x69, 0x2e, 0xf0, 0x13, 0xbc, 0x2b, 0x41, 0xa4, - 0x04, 0x5c, 0x65, 0xfa, 0x51, 0x41, 0xe8, 0xec, 0x7c, 0x16, 0x12, 0xce, 0x7e, 0x36, 0x61, 0xa5, - 0xf4, 0xef, 0x6b, 0x3a, 0xaa, 0x35, 0xbd, 0xb0, 0x2e, 0x2f, 0xce, 0x49, 0xad, 0xe9, 0x85, 0xcb, - 0x2b, 0x58, 0xe3, 0x64, 0x0b, 0xf6, 0x6a, 0x4e, 0x82, 0x1d, 0x0e, 0x2c, 0xd8, 0xa5, 0x88, 0x19, - 0xe8, 0x2a, 0x62, 0xe4, 0x49, 0xc1, 0x60, 0xd7, 0x93, 0x82, 0xf7, 0xc3, 0xb0, 0xeb, 0x6f, 0x90, - 0xd0, 0x8d, 0x49, 0x9d, 0xad, 0x05, 0x26, 0x7e, 0x2a, 0x5a, 0xad, 0xcf, 0x27, 0xa0, 0x38, 0x85, - 0x9d, 0x94, 0x8b, 0xc3, 0x3d, 0xc8, 0xc5, 0x2e, 0xda, 0x68, 0x24, 0x1f, 0x6d, 0x74, 0xea, 0xe8, - 0xda, 0x68, 0xf4, 0x58, 0xb5, 0x11, 0xca, 0x45, 0x1b, 0xf5, 0x24, 0xe8, 0x8d, 0xed, 0xe6, 0x99, - 0x7d, 0xb6, 0x9b, 0xdd, 0x54, 0xd1, 0xd9, 0x43, 0xab, 0xa2, 0x6c, 0x2d, 0xf3, 0xd0, 0xa1, 0xb4, - 0xcc, 0xe7, 0x0a, 0x70, 0x56, 0xcb, 0x61, 0x3a, 0xfb, 0xdd, 0x75, 0x2a, 0x89, 0xd8, 0xdd, 0x6b, - 0xfc, 0x34, 0xcd, 0x48, 0x59, 0xd3, 0xd9, 0x6f, 0x0a, 0x82, 0x0d, 0x2c, 0x96, 0xf9, 0x45, 0x42, - 0x56, 0xff, 0x39, 0x2d, 0xa4, 0x67, 0x44, 0x3b, 0x56, 0x18, 0x74, 0x7e, 0xd1, 0xdf, 0x22, 0x9b, - 0x36, 0x5d, 0x59, 0x70, 0x46, 0x83, 0xb0, 0x89, 0x87, 0x9e, 0xe4, 0x4c, 0x98, 0x80, 0xa0, 0x82, - 0x7a, 0x50, 0xdc, 0x57, 0x2d, 0x65, 0x82, 0x82, 0xca, 0xee, 0xb0, 0x14, 0xbf, 0x72, 0x67, 0x77, - 0x58, 0x60, 0x9a, 0xc2, 0xb0, 0xff, 0x87, 0x05, 0xe7, 0x32, 0x87, 0xe2, 0x04, 0x94, 0xef, 0x76, - 0x52, 0xf9, 0xae, 0xe4, 0xb5, 0xdd, 0x30, 0xde, 0xa2, 0x8b, 0x22, 0xfe, 0x37, 0x16, 0x0c, 0x6b, - 0xfc, 0x13, 0x78, 0x55, 0x37, 0xf9, 0xaa, 0xf9, 0xed, 0xac, 0xaa, 0x1d, 0xef, 0xf6, 0xbb, 0x05, - 0x50, 0xd5, 0x3e, 0xa7, 0x6a, 0xb2, 0x96, 0xf2, 0x3e, 0xe7, 0xbb, 0x3b, 0xd0, 0xc7, 0x8e, 0xa7, - 0xa3, 0x7c, 0x42, 0x6f, 0x92, 0xfc, 0xd9, 0x51, 0xb7, 0x3e, 0xfa, 0x67, 0x7f, 0x23, 0x2c, 0x18, - 0xb2, 0xea, 0xe4, 0x6e, 0x44, 0xa5, 0x79, 0x5d, 0x24, 0xcb, 0xe9, 0xea, 0xe4, 0xa2, 0x1d, 0x2b, - 0x0c, 0xaa, 0x1e, 0xdc, 0x5a, 0xe0, 0xcf, 0x78, 0x4e, 0x24, 0xef, 0x42, 0x55, 0xea, 0x61, 0x5e, - 0x02, 0xb0, 0xc6, 0x61, 0x27, 0xd7, 0x6e, 0xd4, 0xf2, 0x9c, 0x1d, 0x63, 0xff, 0x6c, 0x54, 0x8d, - 0x50, 0x20, 0x6c, 0xe2, 0xd9, 0x4d, 0x18, 0x4b, 0xbe, 0xc4, 0x2c, 0x59, 0x67, 0x61, 0xa3, 0x3d, - 0x0d, 0xe7, 0x24, 0x54, 0x1d, 0xf6, 0xd4, 0x42, 0xdb, 0x11, 0x32, 0x41, 0x07, 0x4f, 0x4a, 0x00, - 0xd6, 0x38, 0xf6, 0xaf, 0x5b, 0x70, 0x3a, 0x63, 0xd0, 0x72, 0x4c, 0x46, 0x8c, 0xb5, 0xb4, 0xc9, - 0x52, 0xec, 0xef, 0x84, 0xfe, 0x3a, 0x59, 0x77, 0x64, 0x60, 0xa2, 0x21, 0xdb, 0x67, 0x79, 0x33, - 0x96, 0x70, 0xfb, 0xbf, 0x5a, 0x30, 0x92, 0xec, 0x6b, 0xc4, 0x12, 0x7c, 0xf8, 0x30, 0xb9, 0x51, - 0x2d, 0xd8, 0x22, 0xe1, 0x0e, 0x7d, 0x73, 0x2b, 0x95, 0xe0, 0xd3, 0x81, 0x81, 0x33, 0x9e, 0x62, - 0xb5, 0x7e, 0xeb, 0x6a, 0xb4, 0xe5, 0x8c, 0xbc, 0x99, 0xe7, 0x8c, 0xd4, 0x1f, 0xd3, 0x0c, 0x62, - 0x50, 0x2c, 0xb1, 0xc9, 0xdf, 0xfe, 0x5e, 0x09, 0x54, 0xb6, 0x32, 0x8b, 0x0a, 0xcb, 0x29, 0xa6, - 0xee, 0xa0, 0x79, 0x5d, 0x6a, 0x32, 0x94, 0xf6, 0x0a, 0xd3, 0xe0, 0x5e, 0x12, 0xd3, 0x55, 0xaa, + 0xfb, 0xe5, 0x4b, 0xf6, 0x77, 0xfb, 0xe9, 0xeb, 0xb5, 0x82, 0x99, 0x90, 0xd4, 0x23, 0xfa, 0x7d, + 0xdb, 0xa1, 0x27, 0x26, 0x89, 0xfa, 0xbe, 0x37, 0xf0, 0x02, 0xa6, 0xed, 0x89, 0x03, 0xb2, 0xc2, + 0x81, 0x0a, 0xca, 0x14, 0xf7, 0x2d, 0x28, 0xf3, 0x02, 0x0c, 0x45, 0xd1, 0xc6, 0x72, 0xe8, 0x6e, + 0x39, 0x31, 0xb9, 0x46, 0x76, 0x84, 0xed, 0xab, 0x8b, 0x40, 0xac, 0x5c, 0xd1, 0x40, 0x9c, 0xc4, + 0x45, 0x73, 0x30, 0xaa, 0xcb, 0xba, 0x90, 0x30, 0x66, 0x39, 0x17, 0x7c, 0x26, 0xa8, 0x8c, 0x6f, + 0x5d, 0x08, 0x46, 0x20, 0xe0, 0xce, 0x67, 0xa8, 0x3c, 0x4d, 0x34, 0xd2, 0x8e, 0xf4, 0x25, 0xe5, + 0x69, 0x82, 0x0e, 0xed, 0x4b, 0xc7, 0x13, 0x68, 0x11, 0x4e, 0xf3, 0x89, 0x31, 0xd5, 0x6a, 0x19, + 0x6f, 0xd4, 0x9f, 0x2c, 0xc0, 0x39, 0xd7, 0x89, 0x82, 0xb3, 0x9e, 0x43, 0xcf, 0xc1, 0x80, 0x6a, + 0x9e, 0x9f, 0x15, 0x67, 0x3b, 0xca, 0xb7, 0xa4, 0xc8, 0xcc, 0xd7, 0xb1, 0x89, 0x87, 0x3e, 0x08, + 0x0f, 0xeb, 0xbf, 0x3c, 0x31, 0x8f, 0x1f, 0x78, 0xce, 0x8a, 0x8a, 0x59, 0xea, 0xaa, 0x9f, 0xb9, + 0x4c, 0xb4, 0x3a, 0xee, 0xf6, 0x3c, 0x5a, 0x83, 0xf3, 0x0a, 0x74, 0xc9, 0x8f, 0x59, 0x96, 0x4d, + 0x44, 0xa6, 0x9d, 0x88, 0xdc, 0x08, 0x3d, 0x71, 0x65, 0xb4, 0xba, 0x0d, 0x76, 0xce, 0x8d, 0xaf, + 0x64, 0x61, 0xe2, 0x05, 0xbc, 0x07, 0x15, 0x34, 0x09, 0x55, 0xe2, 0x3b, 0x6b, 0x1e, 0x59, 0x9a, + 0x99, 0x67, 0x95, 0xb7, 0x8c, 0xf3, 0xd5, 0x4b, 0x12, 0x80, 0x35, 0x8e, 0x8a, 0xfb, 0x1d, 0xec, + 0x7a, 0x33, 0xf1, 0x32, 0x9c, 0x69, 0xd4, 0x5a, 0xd4, 0x22, 0x74, 0x6b, 0x64, 0xaa, 0xc6, 0xc2, + 0x1c, 0xe9, 0x87, 0xe1, 0x95, 0x51, 0x55, 0x50, 0xfb, 0xdc, 0xcc, 0x72, 0x07, 0x0e, 0xce, 0x7c, + 0x92, 0x85, 0xc3, 0x86, 0xc1, 0xf6, 0xce, 0xd8, 0xe9, 0x54, 0x38, 0x2c, 0x6d, 0xc4, 0x1c, 0x86, + 0xae, 0x02, 0x62, 0x19, 0x12, 0x57, 0xe2, 0xb8, 0xa5, 0x4c, 0xd0, 0xb1, 0x33, 0xec, 0x95, 0x54, + 0x70, 0xdf, 0xe5, 0x0e, 0x0c, 0x9c, 0xf1, 0x14, 0xb5, 0x68, 0xfc, 0x80, 0x51, 0x1f, 0x7b, 0x38, + 0x69, 0xd1, 0x5c, 0xe7, 0xcd, 0x58, 0xc2, 0xed, 0x7f, 0x67, 0xc1, 0x90, 0x5a, 0xda, 0x27, 0x90, + 0x4e, 0xe4, 0x25, 0xd3, 0x89, 0xe6, 0x8e, 0x2e, 0x1c, 0x59, 0xcf, 0xbb, 0xc4, 0xa4, 0x7f, 0x73, + 0x00, 0x40, 0x0b, 0x50, 0xa5, 0xbb, 0xac, 0xae, 0xba, 0xeb, 0x81, 0x15, 0x5e, 0x59, 0x15, 0x79, + 0xca, 0xf7, 0xb7, 0x22, 0xcf, 0x0a, 0x9c, 0x95, 0x96, 0x05, 0x3f, 0xec, 0xbb, 0x12, 0x44, 0x4a, + 0x16, 0x56, 0xa6, 0x1f, 0x15, 0x84, 0xce, 0xce, 0x67, 0x21, 0xe1, 0xec, 0x67, 0x13, 0x06, 0x4d, + 0xff, 0xbe, 0x56, 0xa6, 0x5a, 0xfe, 0x0b, 0xeb, 0xf2, 0x8e, 0x9d, 0xd4, 0xf2, 0x5f, 0xb8, 0xbc, + 0x82, 0x35, 0x4e, 0xb6, 0x0e, 0xa8, 0xe6, 0xa4, 0x03, 0xe0, 0xc0, 0x3a, 0x40, 0x4a, 0xa3, 0x81, + 0xae, 0xd2, 0x48, 0x1e, 0x2a, 0x0c, 0x76, 0x3d, 0x54, 0x78, 0x1f, 0x0c, 0xbb, 0xfe, 0x06, 0x09, + 0xdd, 0x98, 0xd4, 0xd9, 0x5a, 0x60, 0x92, 0xaa, 0xa2, 0x2d, 0x80, 0xf9, 0x04, 0x14, 0xa7, 0xb0, + 0x93, 0x22, 0x74, 0xb8, 0x07, 0x11, 0xda, 0x45, 0x71, 0x8d, 0xe4, 0xa3, 0xb8, 0x4e, 0x1d, 0x5d, + 0x71, 0x8d, 0x1e, 0xab, 0xe2, 0x42, 0xb9, 0x28, 0xae, 0x9e, 0x74, 0x82, 0xb1, 0x33, 0x3d, 0xb3, + 0xcf, 0xce, 0xb4, 0x9b, 0xd6, 0x3a, 0x7b, 0x68, 0xad, 0x95, 0xad, 0x90, 0x1e, 0x3a, 0x6e, 0x85, + 0xf4, 0xd9, 0x02, 0x9c, 0xd5, 0x22, 0x9b, 0x2e, 0x14, 0x77, 0x9d, 0x0a, 0x2d, 0x76, 0xa3, 0x1b, + 0x3f, 0xa3, 0x33, 0x12, 0xe1, 0x74, 0x4e, 0x9d, 0x82, 0x60, 0x03, 0x8b, 0xe5, 0x93, 0x91, 0x90, + 0x55, 0x95, 0x4e, 0xcb, 0xf3, 0x19, 0xd1, 0x8e, 0x15, 0x06, 0x9d, 0x8a, 0xf4, 0xb7, 0xc8, 0xd1, + 0x4d, 0xd7, 0x2b, 0x9c, 0xd1, 0x20, 0x6c, 0xe2, 0xa1, 0x27, 0x39, 0x13, 0x26, 0x4b, 0xa8, 0x4c, + 0x1f, 0x14, 0xb7, 0x60, 0x4b, 0xf1, 0xa1, 0xa0, 0xb2, 0x3b, 0x2c, 0x71, 0xb0, 0xdc, 0xd9, 0x1d, + 0x16, 0xee, 0xa6, 0x30, 0xec, 0xff, 0x61, 0xc1, 0xb9, 0xcc, 0xa1, 0x38, 0x01, 0x3d, 0xbd, 0x9d, + 0xd4, 0xd3, 0x2b, 0x79, 0x6d, 0x62, 0x8c, 0xb7, 0xe8, 0xa2, 0xb3, 0xff, 0x8d, 0x05, 0xc3, 0x1a, + 0xff, 0x04, 0x5e, 0xd5, 0x4d, 0xbe, 0x6a, 0x7e, 0xfb, 0xb5, 0x6a, 0xc7, 0xbb, 0xfd, 0x5e, 0x01, + 0x54, 0x0d, 0xd1, 0xa9, 0x9a, 0xac, 0xd0, 0xbc, 0xcf, 0xa9, 0xf1, 0x0e, 0xf4, 0xb1, 0x43, 0xef, + 0x28, 0x9f, 0x80, 0x9e, 0x24, 0x7f, 0x76, 0x80, 0xae, 0x03, 0x0a, 0xd8, 0xdf, 0x08, 0x0b, 0x86, + 0xac, 0xe6, 0xb9, 0x1b, 0x51, 0xc1, 0x5f, 0x17, 0x29, 0x78, 0xba, 0xe6, 0xb9, 0x68, 0xc7, 0x0a, + 0x83, 0x6a, 0x12, 0xb7, 0x16, 0xf8, 0x33, 0x9e, 0x13, 0xc9, 0x1b, 0x56, 0x95, 0x26, 0x99, 0x97, + 0x00, 0xac, 0x71, 0xd8, 0x79, 0xb8, 0x1b, 0xb5, 0x3c, 0x67, 0xc7, 0xd8, 0x95, 0x1b, 0xb5, 0x28, + 0x14, 0x08, 0x9b, 0x78, 0x76, 0x13, 0xc6, 0x92, 0x2f, 0x31, 0x4b, 0xd6, 0x59, 0x30, 0x6a, 0x4f, + 0xc3, 0x39, 0x09, 0x55, 0x87, 0x3d, 0xb5, 0xd0, 0x76, 0x84, 0x4c, 0xd0, 0x21, 0x99, 0x12, 0x80, + 0x35, 0x8e, 0xfd, 0x1b, 0x16, 0x9c, 0xce, 0x18, 0xb4, 0x1c, 0x53, 0x1c, 0x63, 0x2d, 0x6d, 0xb2, + 0x6c, 0x80, 0x1f, 0x87, 0xfe, 0x3a, 0x59, 0x77, 0x64, 0xb8, 0xa3, 0x21, 0x3d, 0x67, 0x79, 0x33, + 0x96, 0x70, 0xfb, 0xbf, 0x5a, 0x30, 0x92, 0xec, 0x6b, 0xc4, 0xd2, 0x86, 0xf8, 0x30, 0xb9, 0x51, + 0x2d, 0xd8, 0x22, 0xe1, 0x0e, 0x7d, 0x73, 0x2b, 0x95, 0x36, 0xd4, 0x81, 0x81, 0x33, 0x9e, 0x62, + 0x15, 0x84, 0xeb, 0x6a, 0xb4, 0xe5, 0x8c, 0xbc, 0x99, 0xe7, 0x8c, 0xd4, 0x1f, 0xd3, 0x0c, 0x8d, + 0x50, 0x2c, 0xb1, 0xc9, 0xdf, 0xfe, 0x5e, 0x09, 0x54, 0x0e, 0x34, 0x8b, 0x35, 0xcb, 0x29, 0x52, + 0xef, 0xa0, 0xd9, 0x62, 0x6a, 0x32, 0x94, 0xf6, 0x0a, 0xfe, 0xe0, 0xbe, 0x17, 0xd3, 0x01, 0xab, 0xde, 0x70, 0x55, 0x83, 0xb0, 0x89, 0x47, 0x7b, 0xe2, 0xb9, 0x5b, 0x84, 0x3f, 0xd4, 0x97, 0xec, - 0xc9, 0x82, 0x04, 0x60, 0x8d, 0x43, 0x7b, 0x52, 0x77, 0xd7, 0xd7, 0xc5, 0x96, 0x5f, 0xf5, 0x84, - 0x8e, 0x0e, 0x66, 0x10, 0x5e, 0xbe, 0x3d, 0xd8, 0x14, 0x56, 0xb0, 0x51, 0xbe, 0x3d, 0xd8, 0xc4, - 0x0c, 0x42, 0xed, 0x36, 0x3f, 0x08, 0x9b, 0x8e, 0xe7, 0xbe, 0x46, 0xea, 0x8a, 0x8b, 0xb0, 0x7e, - 0x95, 0xdd, 0x76, 0xbd, 0x13, 0x05, 0x67, 0x3d, 0x47, 0x67, 0x60, 0x2b, 0x24, 0x75, 0xb7, 0x16, - 0x9b, 0xd4, 0x20, 0x39, 0x03, 0x97, 0x3b, 0x30, 0x70, 0xc6, 0x53, 0x68, 0x0a, 0x46, 0x64, 0xb6, - 0xb9, 0xac, 0x25, 0x34, 0x90, 0xac, 0x5d, 0x82, 0x93, 0x60, 0x9c, 0xc6, 0xa7, 0x52, 0xad, 0x29, - 0xca, 0x8d, 0x31, 0x63, 0xd9, 0x90, 0x6a, 0xb2, 0x0c, 0x19, 0x56, 0x18, 0xf6, 0xa7, 0x8a, 0x54, - 0x0b, 0x77, 0xa9, 0xea, 0x77, 0x62, 0x31, 0x9c, 0xc9, 0x19, 0x59, 0xea, 0x61, 0x46, 0x3e, 0x0b, - 0x83, 0xb7, 0xa3, 0xc0, 0x57, 0xf1, 0x91, 0xe5, 0xae, 0xf1, 0x91, 0x06, 0x56, 0x76, 0x7c, 0x64, - 0x5f, 0x5e, 0xf1, 0x91, 0xfd, 0x87, 0x8c, 0x8f, 0xfc, 0xbd, 0x32, 0xa8, 0x3b, 0x6d, 0xae, 0x93, - 0xf8, 0x4e, 0x10, 0x6e, 0xba, 0x7e, 0x83, 0x65, 0xe9, 0x7f, 0xc3, 0x82, 0x41, 0xbe, 0x5e, 0x16, - 0xcc, 0xfc, 0xb6, 0xf5, 0x9c, 0x2e, 0x4b, 0x49, 0x30, 0x9b, 0x58, 0x35, 0x18, 0xa5, 0xee, 0xbb, - 0x35, 0x41, 0x38, 0xd1, 0x23, 0xf4, 0x71, 0x00, 0xe9, 0x1f, 0x5d, 0x97, 0x22, 0x73, 0x3e, 0x9f, - 0xfe, 0x61, 0xb2, 0xae, 0x6d, 0xe0, 0x55, 0xc5, 0x04, 0x1b, 0x0c, 0xd1, 0xe7, 0x74, 0xee, 0x1f, - 0x4f, 0xa4, 0xf8, 0xe8, 0xb1, 0x8c, 0x4d, 0x2f, 0x99, 0x7f, 0x18, 0xfa, 0x5d, 0xbf, 0x41, 0xe7, - 0x89, 0x88, 0x23, 0x7b, 0x47, 0x56, 0x85, 0x8b, 0x85, 0xc0, 0xa9, 0x4f, 0x3b, 0x9e, 0xe3, 0xd7, - 0x48, 0x38, 0xcf, 0xd1, 0xcd, 0x0b, 0xe8, 0x59, 0x03, 0x96, 0x84, 0x3a, 0x6e, 0x03, 0x2a, 0xf7, - 0x72, 0x1b, 0xd0, 0xf9, 0x0f, 0xc0, 0x68, 0xc7, 0xc7, 0x3c, 0x50, 0xa2, 0xdf, 0xe1, 0x73, 0x04, - 0xed, 0xdf, 0xea, 0xd3, 0x4a, 0xeb, 0x7a, 0x50, 0xe7, 0x77, 0xd2, 0x84, 0xfa, 0x8b, 0x0a, 0x1b, - 0x37, 0xc7, 0x29, 0x62, 0x5c, 0x62, 0xaf, 0x1a, 0xb1, 0xc9, 0x92, 0xce, 0xd1, 0x96, 0x13, 0x12, - 0xff, 0xb8, 0xe7, 0xe8, 0xb2, 0x62, 0x82, 0x0d, 0x86, 0x68, 0x23, 0x91, 0xe9, 0x73, 0xf9, 0xe8, - 0x99, 0x3e, 0xac, 0xf6, 0x57, 0xd6, 0xd5, 0x0d, 0x5f, 0xb6, 0x60, 0xd8, 0x4f, 0xcc, 0xdc, 0x7c, - 0x82, 0x7b, 0xb3, 0x57, 0x05, 0xbf, 0x12, 0x2d, 0xd9, 0x86, 0x53, 0xfc, 0xb3, 0x54, 0x5a, 0xf9, - 0x80, 0x2a, 0x4d, 0x5f, 0x6e, 0xd5, 0xd7, 0xed, 0x72, 0x2b, 0xe4, 0xab, 0xdb, 0xfd, 0xfa, 0x73, - 0xbf, 0xdd, 0x0f, 0x32, 0x6e, 0xf6, 0xbb, 0x05, 0xd5, 0x5a, 0x48, 0x9c, 0xf8, 0x90, 0x17, 0xbd, - 0xb1, 0xb0, 0x89, 0x19, 0x49, 0x00, 0x6b, 0x5a, 0xf6, 0xff, 0x29, 0xc1, 0x29, 0x39, 0x22, 0x32, - 0x31, 0x80, 0xea, 0x47, 0xce, 0x57, 0x1b, 0xb7, 0x4a, 0x3f, 0x5e, 0x91, 0x00, 0xac, 0x71, 0xa8, - 0x3d, 0xd6, 0x8e, 0xc8, 0x52, 0x8b, 0xf8, 0x0b, 0xee, 0x5a, 0x24, 0xce, 0x39, 0xd5, 0x42, 0xb9, - 0xa1, 0x41, 0xd8, 0xc4, 0xa3, 0xc6, 0x38, 0xb7, 0x8b, 0xa3, 0x74, 0x52, 0x91, 0xb0, 0xb7, 0xb1, - 0x84, 0xa3, 0x5f, 0xca, 0x2c, 0x33, 0x9c, 0x4f, 0x3a, 0x5d, 0x47, 0x3e, 0xc4, 0x01, 0xef, 0x06, - 0xfd, 0x9b, 0x16, 0x9c, 0xe5, 0xad, 0x72, 0x24, 0x6f, 0xb4, 0xea, 0x4e, 0x4c, 0xa2, 0x7c, 0xca, - 0xfe, 0x67, 0xf4, 0x4f, 0x3b, 0x79, 0xb3, 0xd8, 0xe2, 0xec, 0xde, 0xa0, 0xd7, 0x2d, 0x18, 0xd9, - 0x4c, 0x54, 0x62, 0x91, 0xaa, 0xe3, 0xa8, 0x45, 0x12, 0x12, 0x44, 0xf5, 0x52, 0x4b, 0xb6, 0x47, - 0x38, 0xcd, 0xdd, 0xfe, 0x6f, 0x16, 0x98, 0x62, 0xf4, 0xe4, 0x0b, 0xb8, 0x1c, 0xdc, 0x14, 0x94, - 0xd6, 0x65, 0xb9, 0xab, 0x75, 0xf9, 0x28, 0x14, 0xdb, 0x6e, 0x5d, 0xec, 0x2f, 0xf4, 0xe9, 0xeb, - 0xfc, 0x2c, 0xa6, 0xed, 0xf6, 0x3f, 0x2a, 0x6b, 0xbf, 0x85, 0xc8, 0x56, 0xfb, 0xa1, 0x78, 0xed, - 0x75, 0x55, 0x02, 0x8e, 0xbf, 0xf9, 0xf5, 0x8e, 0x12, 0x70, 0x3f, 0x79, 0xf0, 0x64, 0x44, 0x3e, - 0x40, 0xdd, 0x2a, 0xc0, 0xf5, 0xef, 0x93, 0x89, 0x78, 0x1b, 0x2a, 0x74, 0x0b, 0xc6, 0x1c, 0x90, - 0x95, 0x44, 0xa7, 0x2a, 0x57, 0x44, 0xfb, 0xbd, 0xdd, 0xf1, 0xf7, 0x1e, 0xbc, 0x5b, 0xf2, 0x69, - 0xac, 0xe8, 0xa3, 0x08, 0xaa, 0xf4, 0x37, 0x4b, 0x9a, 0x14, 0x9b, 0xbb, 0x1b, 0x4a, 0x66, 0x4a, - 0x40, 0x2e, 0x19, 0x99, 0x9a, 0x0f, 0xf2, 0xa1, 0xca, 0xae, 0x51, 0x66, 0x4c, 0xf9, 0x1e, 0x70, - 0x59, 0xa5, 0x2e, 0x4a, 0xc0, 0xbd, 0xdd, 0xf1, 0x17, 0x0e, 0xce, 0x54, 0x3d, 0x8e, 0x35, 0x0b, - 0xfb, 0x2b, 0x25, 0x3d, 0x77, 0x45, 0xe5, 0xbf, 0x1f, 0x8a, 0xb9, 0xfb, 0x7c, 0x6a, 0xee, 0x5e, - 0xe8, 0x98, 0xbb, 0xc3, 0xfa, 0xba, 0xdf, 0xc4, 0x6c, 0x3c, 0x69, 0x43, 0x60, 0x7f, 0x7f, 0x03, + 0xc9, 0x82, 0x04, 0x60, 0x8d, 0x43, 0x7b, 0x52, 0x77, 0xd7, 0xd7, 0x85, 0x23, 0x41, 0xf5, 0x84, + 0x8e, 0x0e, 0x66, 0x10, 0x5e, 0x14, 0x3e, 0xd8, 0x14, 0x06, 0xb3, 0x51, 0x14, 0x3e, 0xd8, 0xc4, + 0x0c, 0x42, 0x4d, 0x3c, 0x3f, 0x08, 0x9b, 0x8e, 0xe7, 0xbe, 0x46, 0xea, 0x8a, 0x8b, 0x30, 0x94, + 0x95, 0x89, 0x77, 0xbd, 0x13, 0x05, 0x67, 0x3d, 0x47, 0x67, 0x60, 0x2b, 0x24, 0x75, 0xb7, 0x16, + 0x9b, 0xd4, 0x20, 0x39, 0x03, 0x97, 0x3b, 0x30, 0x70, 0xc6, 0x53, 0x68, 0x0a, 0x46, 0x64, 0x0e, + 0xbb, 0xac, 0x50, 0x34, 0x90, 0xac, 0x88, 0x82, 0x93, 0x60, 0x9c, 0xc6, 0xa7, 0x52, 0xad, 0x29, + 0x8a, 0x98, 0x31, 0xbb, 0xda, 0x90, 0x6a, 0xb2, 0xb8, 0x19, 0x56, 0x18, 0xf6, 0x27, 0x8b, 0x54, + 0x0b, 0x77, 0xa9, 0x15, 0x78, 0x62, 0x91, 0xa1, 0xc9, 0x19, 0x59, 0xea, 0x61, 0x46, 0x3e, 0x0b, + 0x83, 0xb7, 0xa3, 0xc0, 0x57, 0x51, 0x97, 0xe5, 0xae, 0x51, 0x97, 0x06, 0x56, 0x76, 0xd4, 0x65, + 0x5f, 0x5e, 0x51, 0x97, 0xfd, 0x87, 0x8c, 0xba, 0xfc, 0xfd, 0x32, 0xa8, 0x9b, 0x72, 0xae, 0x93, + 0xf8, 0x4e, 0x10, 0x6e, 0xba, 0x7e, 0x83, 0xe5, 0xfe, 0x7f, 0xcd, 0x82, 0x41, 0xbe, 0x5e, 0x16, + 0xcc, 0xac, 0xb9, 0xf5, 0x9c, 0xae, 0x60, 0x49, 0x30, 0x9b, 0x58, 0x35, 0x18, 0xa5, 0x6e, 0xd1, + 0x35, 0x41, 0x38, 0xd1, 0x23, 0xf4, 0x31, 0x00, 0xe9, 0x75, 0x5d, 0x97, 0x22, 0x73, 0x3e, 0x9f, + 0xfe, 0x61, 0xb2, 0xae, 0x6d, 0xe0, 0x55, 0xc5, 0x04, 0x1b, 0x0c, 0xd1, 0x67, 0x75, 0x46, 0x21, + 0x4f, 0xcf, 0xf8, 0xc8, 0xb1, 0x8c, 0x4d, 0x2f, 0xf9, 0x84, 0x18, 0xfa, 0x5d, 0xbf, 0x41, 0xe7, + 0x89, 0x88, 0x4e, 0x7b, 0x47, 0x56, 0xdd, 0x8c, 0x85, 0xc0, 0xa9, 0x4f, 0x3b, 0x9e, 0xe3, 0xd7, + 0x48, 0x38, 0xcf, 0xd1, 0xcd, 0x6b, 0xed, 0x59, 0x03, 0x96, 0x84, 0x3a, 0xee, 0x18, 0x2a, 0xf7, + 0x72, 0xc7, 0xd0, 0xf9, 0xf7, 0xc3, 0x68, 0xc7, 0xc7, 0x3c, 0x50, 0xfa, 0xe0, 0xe1, 0x33, 0x0f, + 0xed, 0xdf, 0xee, 0xd3, 0x4a, 0xeb, 0x7a, 0x50, 0xe7, 0x37, 0xdd, 0x84, 0xfa, 0x8b, 0x0a, 0x1b, + 0x37, 0xc7, 0x29, 0x62, 0x5c, 0x8d, 0xaf, 0x1a, 0xb1, 0xc9, 0x92, 0xce, 0xd1, 0x96, 0x13, 0x12, + 0xff, 0xb8, 0xe7, 0xe8, 0xb2, 0x62, 0x82, 0x0d, 0x86, 0x68, 0x23, 0x91, 0x3f, 0x74, 0xf9, 0xe8, + 0xf9, 0x43, 0xac, 0xa2, 0x58, 0xd6, 0x85, 0x10, 0x5f, 0xb2, 0x60, 0xd8, 0x4f, 0xcc, 0xdc, 0x7c, + 0x42, 0x86, 0xb3, 0x57, 0x05, 0xbf, 0x68, 0x2d, 0xd9, 0x86, 0x53, 0xfc, 0xb3, 0x54, 0x5a, 0xf9, + 0x80, 0x2a, 0x4d, 0x5f, 0x99, 0xd5, 0xd7, 0xed, 0xca, 0x2c, 0xe4, 0xab, 0x3b, 0x03, 0xfb, 0x73, + 0xbf, 0x33, 0x10, 0x32, 0xee, 0x0b, 0xbc, 0x05, 0xd5, 0x5a, 0x48, 0x9c, 0xf8, 0x90, 0xd7, 0xc7, + 0xb1, 0x60, 0x8c, 0x19, 0x49, 0x00, 0x6b, 0x5a, 0xf6, 0xff, 0x29, 0xc1, 0x29, 0x39, 0x22, 0x32, + 0xdd, 0x80, 0xea, 0x47, 0xce, 0x57, 0x1b, 0xb7, 0x4a, 0x3f, 0x5e, 0x91, 0x00, 0xac, 0x71, 0xa8, + 0x3d, 0xd6, 0x8e, 0xc8, 0x52, 0x8b, 0xf8, 0x0b, 0xee, 0x5a, 0x24, 0x4e, 0x4f, 0xd5, 0x42, 0xb9, + 0xa1, 0x41, 0xd8, 0xc4, 0xa3, 0xc6, 0x38, 0xb7, 0x8b, 0xa3, 0x74, 0xaa, 0x92, 0xb0, 0xb7, 0xb1, + 0x84, 0xa3, 0x5f, 0xce, 0x2c, 0x5e, 0x9c, 0x4f, 0x92, 0x5e, 0x47, 0x96, 0xc5, 0x01, 0x6f, 0x1c, + 0xfd, 0x9b, 0x16, 0x9c, 0xe5, 0xad, 0x72, 0x24, 0x6f, 0xb4, 0xea, 0x4e, 0x4c, 0xa2, 0x7c, 0x2e, + 0x13, 0xc8, 0xe8, 0x9f, 0xf6, 0x07, 0x67, 0xb1, 0xc5, 0xd9, 0xbd, 0x41, 0xaf, 0x5b, 0x30, 0xb2, + 0x99, 0xa8, 0xef, 0x22, 0x55, 0xc7, 0x51, 0x4b, 0x2f, 0x24, 0x88, 0xea, 0xa5, 0x96, 0x6c, 0x8f, + 0x70, 0x9a, 0xbb, 0xfd, 0xdf, 0x2c, 0x30, 0xc5, 0xe8, 0xc9, 0x97, 0x85, 0x39, 0xb8, 0x29, 0x28, + 0xad, 0xcb, 0x72, 0x57, 0xeb, 0xf2, 0x51, 0x28, 0xb6, 0xdd, 0xba, 0xd8, 0x5f, 0xe8, 0x33, 0xdd, + 0xf9, 0x59, 0x4c, 0xdb, 0xed, 0x7f, 0x54, 0xd6, 0x7e, 0x0b, 0x91, 0x03, 0xf7, 0x43, 0xf1, 0xda, + 0xeb, 0xaa, 0xb0, 0x1c, 0x7f, 0xf3, 0xeb, 0x1d, 0x85, 0xe5, 0x7e, 0xea, 0xe0, 0x29, 0x8e, 0x7c, + 0x80, 0xba, 0xd5, 0x95, 0xeb, 0xdf, 0x27, 0xbf, 0xf1, 0x36, 0x54, 0xe8, 0x16, 0x8c, 0x39, 0x20, + 0x2b, 0x89, 0x4e, 0x55, 0xae, 0x88, 0xf6, 0x7b, 0xbb, 0xe3, 0xef, 0x39, 0x78, 0xb7, 0xe4, 0xd3, + 0x58, 0xd1, 0x47, 0x11, 0x54, 0xe9, 0x6f, 0x96, 0x8a, 0x29, 0x36, 0x77, 0x37, 0x94, 0xcc, 0x94, + 0x80, 0x5c, 0xf2, 0x3c, 0x35, 0x1f, 0xe4, 0x43, 0x95, 0x5d, 0xce, 0xcc, 0x98, 0xf2, 0x3d, 0xe0, + 0xb2, 0x4a, 0x88, 0x94, 0x80, 0x7b, 0xbb, 0xe3, 0x2f, 0x1c, 0x9c, 0xa9, 0x7a, 0x1c, 0x6b, 0x16, + 0xf6, 0x1b, 0x25, 0x3d, 0x77, 0x45, 0x3d, 0xc1, 0x1f, 0x8a, 0xb9, 0xfb, 0x7c, 0x6a, 0xee, 0x5e, + 0xe8, 0x98, 0xbb, 0xc3, 0xfa, 0x12, 0xe1, 0xc4, 0x6c, 0x3c, 0x69, 0x43, 0x60, 0x7f, 0x7f, 0x03, 0xb3, 0x80, 0x5e, 0x6d, 0xbb, 0x21, 0x89, 0x96, 0xc3, 0xb6, 0xef, 0xfa, 0x0d, 0x36, 0x1d, 0x2b, 0xa6, 0x05, 0x94, 0x00, 0xe3, 0x34, 0x3e, 0xdd, 0xd4, 0xd3, 0x6f, 0x7e, 0xcb, 0xd9, 0xe2, 0xb3, - 0xca, 0x28, 0x86, 0xb6, 0x22, 0xda, 0xb1, 0xc2, 0xb0, 0xdf, 0x64, 0x67, 0xd9, 0x46, 0xb6, 0x36, - 0x9d, 0x13, 0x1e, 0xbb, 0xb7, 0x9a, 0x57, 0x52, 0x53, 0x73, 0x82, 0x5f, 0x56, 0xcd, 0x61, 0xe8, - 0x0e, 0xf4, 0xaf, 0xf1, 0x8b, 0x1b, 0xf3, 0x29, 0x66, 0x2f, 0x6e, 0x81, 0x64, 0x57, 0xe2, 0xc8, - 0x2b, 0x21, 0xef, 0xe9, 0x9f, 0x58, 0x72, 0xb3, 0xbf, 0x53, 0x86, 0x91, 0xd4, 0xcd, 0xc6, 0x89, - 0x1a, 0xb6, 0x85, 0x7d, 0x6b, 0xd8, 0x7e, 0x04, 0xa0, 0x4e, 0x5a, 0x5e, 0xb0, 0xc3, 0xcc, 0xb1, - 0xd2, 0x81, 0xcd, 0x31, 0x65, 0xc1, 0xcf, 0x2a, 0x2a, 0xd8, 0xa0, 0x28, 0xca, 0xc7, 0xf1, 0x92, - 0xb8, 0xa9, 0xf2, 0x71, 0xc6, 0x95, 0x17, 0x7d, 0x27, 0x7b, 0xe5, 0x85, 0x0b, 0x23, 0xbc, 0x8b, - 0x2a, 0x27, 0xfa, 0x10, 0xa9, 0xcf, 0x2c, 0xab, 0x64, 0x36, 0x49, 0x06, 0xa7, 0xe9, 0xde, 0xcf, - 0x8b, 0xcb, 0xd1, 0xbb, 0xa0, 0x2a, 0xbf, 0x73, 0x34, 0x56, 0xd5, 0x75, 0x25, 0xe4, 0x34, 0x60, - 0x17, 0x8a, 0x8b, 0x9f, 0x1d, 0xe5, 0x1d, 0xe0, 0x7e, 0x95, 0x77, 0xb0, 0xbf, 0x54, 0xa0, 0x76, - 0x3c, 0xef, 0x97, 0xaa, 0x54, 0xf4, 0x04, 0xf4, 0x39, 0xed, 0x78, 0x23, 0xe8, 0xb8, 0xfa, 0x71, - 0x8a, 0xb5, 0x62, 0x01, 0x45, 0x0b, 0x50, 0xaa, 0xeb, 0xea, 0x33, 0x07, 0xf9, 0x9e, 0xda, 0x25, - 0xea, 0xc4, 0x04, 0x33, 0x2a, 0xe8, 0x11, 0x28, 0xc5, 0x4e, 0x43, 0x26, 0xc2, 0xb1, 0xe4, 0xe7, - 0x55, 0xa7, 0x11, 0x61, 0xd6, 0x6a, 0xaa, 0xef, 0xd2, 0x3e, 0xea, 0xfb, 0x05, 0x18, 0x8a, 0xdc, - 0x86, 0xef, 0xc4, 0xed, 0x90, 0x18, 0xc7, 0x7c, 0x3a, 0x72, 0xc3, 0x04, 0xe2, 0x24, 0xae, 0xfd, - 0xdb, 0x83, 0x70, 0x66, 0x65, 0x66, 0x51, 0xd6, 0x54, 0x3f, 0xb6, 0x5c, 0xb6, 0x2c, 0x1e, 0x27, - 0x97, 0xcb, 0xd6, 0x85, 0xbb, 0x67, 0xe4, 0xb2, 0x79, 0x46, 0x2e, 0x5b, 0x32, 0xb1, 0xa8, 0x98, - 0x47, 0x62, 0x51, 0x56, 0x0f, 0x7a, 0x49, 0x2c, 0x3a, 0xb6, 0xe4, 0xb6, 0x3d, 0x3b, 0x74, 0xa0, - 0xe4, 0x36, 0x95, 0xf9, 0x97, 0x4b, 0xca, 0x47, 0x97, 0x4f, 0x95, 0x99, 0xf9, 0xa7, 0xb2, 0xae, - 0x78, 0x3a, 0x93, 0x10, 0xf5, 0x2f, 0xe7, 0xdf, 0x81, 0x1e, 0xb2, 0xae, 0x44, 0x46, 0x95, 0x99, - 0xe9, 0xd7, 0x9f, 0x47, 0xa6, 0x5f, 0x56, 0x77, 0xf6, 0xcd, 0xf4, 0x7b, 0x01, 0x86, 0x6a, 0x5e, - 0xe0, 0x93, 0xe5, 0x30, 0x88, 0x83, 0x5a, 0xe0, 0x09, 0xb3, 0x5e, 0xdf, 0xf1, 0x62, 0x02, 0x71, - 0x12, 0xb7, 0x5b, 0x9a, 0x60, 0xf5, 0xa8, 0x69, 0x82, 0x70, 0x9f, 0xd2, 0x04, 0x7f, 0x5e, 0x27, - 0xb4, 0x0f, 0xb0, 0x2f, 0xf2, 0x91, 0xfc, 0xbf, 0x48, 0x2f, 0x59, 0xed, 0xe8, 0x0d, 0x7e, 0xf7, - 0x22, 0x35, 0x8c, 0x67, 0x82, 0x26, 0x35, 0xfc, 0x06, 0xd9, 0x90, 0xbc, 0x72, 0x0c, 0x13, 0xf6, - 0xd6, 0x8a, 0x66, 0xa3, 0xee, 0x63, 0xd4, 0x4d, 0x38, 0xd9, 0x91, 0xa3, 0x24, 0xdc, 0x7f, 0xad, - 0x00, 0x3f, 0xb2, 0x6f, 0x17, 0xd0, 0x1d, 0x80, 0xd8, 0x69, 0x88, 0x89, 0x2a, 0x0e, 0x4c, 0x8e, - 0x18, 0x5e, 0xb9, 0x2a, 0xe9, 0xf1, 0x4a, 0x31, 0xea, 0x2f, 0x3b, 0x8a, 0x90, 0xbf, 0x59, 0x54, - 0x65, 0xe0, 0x75, 0x14, 0xd4, 0xc4, 0x81, 0x47, 0x30, 0x83, 0x50, 0xf5, 0x1f, 0x92, 0x86, 0xbe, - 0xb8, 0x5c, 0x7d, 0x3e, 0xcc, 0x5a, 0xb1, 0x80, 0xa2, 0xe7, 0x60, 0xc0, 0xf1, 0x3c, 0x9e, 0x8f, - 0x43, 0x22, 0x71, 0xf9, 0x92, 0xae, 0xec, 0xa7, 0x41, 0xd8, 0xc4, 0xb3, 0xff, 0xbc, 0x00, 0xe3, - 0xfb, 0xc8, 0x94, 0x8e, 0x3c, 0xcc, 0x72, 0xcf, 0x79, 0x98, 0x22, 0x47, 0xa1, 0xaf, 0x4b, 0x8e, - 0xc2, 0x73, 0x30, 0x10, 0x13, 0xa7, 0x29, 0x02, 0xb2, 0x84, 0x27, 0x40, 0x9f, 0x00, 0x6b, 0x10, - 0x36, 0xf1, 0xa8, 0x14, 0x1b, 0x76, 0x6a, 0x35, 0x12, 0x45, 0x32, 0x09, 0x41, 0x78, 0x53, 0x73, - 0xcb, 0x70, 0x60, 0x4e, 0xea, 0xa9, 0x04, 0x0b, 0x9c, 0x62, 0x99, 0x1e, 0xf0, 0x6a, 0x8f, 0x03, - 0xfe, 0xcd, 0x02, 0x3c, 0xba, 0xa7, 0x76, 0xeb, 0x39, 0x3f, 0xa4, 0x1d, 0x91, 0x30, 0x3d, 0x71, - 0x6e, 0x44, 0x24, 0xc4, 0x0c, 0xc2, 0x47, 0xa9, 0xd5, 0x32, 0x2e, 0x86, 0xcf, 0x3b, 0x59, 0x8a, - 0x8f, 0x52, 0x82, 0x05, 0x4e, 0xb1, 0x3c, 0xec, 0xb4, 0xfc, 0x4e, 0x09, 0x1e, 0xef, 0xc1, 0x06, - 0xc8, 0x31, 0xa9, 0x2c, 0x99, 0x00, 0x59, 0xbc, 0x4f, 0x09, 0x90, 0x87, 0x1b, 0xae, 0xb7, 0xf2, - 0x26, 0x7b, 0x4a, 0x5e, 0x7b, 0xb3, 0x00, 0xe7, 0xbb, 0x1b, 0x2c, 0xe8, 0x7d, 0x30, 0x12, 0xaa, - 0x58, 0x35, 0x33, 0x77, 0xf2, 0x34, 0xf7, 0xb7, 0x24, 0x40, 0x38, 0x8d, 0x8b, 0x26, 0x00, 0x5a, - 0x4e, 0xbc, 0x11, 0x5d, 0xda, 0x76, 0xa3, 0x58, 0x54, 0x50, 0x1a, 0xe6, 0x27, 0x7c, 0xb2, 0x15, - 0x1b, 0x18, 0x94, 0x1d, 0xfb, 0x37, 0x1b, 0x5c, 0x0f, 0x62, 0xfe, 0x10, 0xdf, 0x6c, 0x9d, 0x96, - 0xf7, 0xcd, 0x18, 0x20, 0x9c, 0xc6, 0xa5, 0xec, 0xd8, 0x19, 0x32, 0xef, 0x28, 0xdf, 0x85, 0x31, - 0x76, 0x0b, 0xaa, 0x15, 0x1b, 0x18, 0xe9, 0xac, 0xd0, 0xf2, 0xfe, 0x59, 0xa1, 0xf6, 0x3f, 0x2c, - 0xc0, 0xb9, 0xae, 0x06, 0x6f, 0x6f, 0x62, 0xea, 0xc1, 0xcb, 0xe4, 0x3c, 0xe4, 0x0a, 0x3b, 0x58, - 0x06, 0xe0, 0x9f, 0x74, 0x99, 0x69, 0x22, 0x03, 0xf0, 0xf0, 0x85, 0x0d, 0x1e, 0xbc, 0xf1, 0xec, - 0x48, 0xfa, 0x2b, 0x1d, 0x20, 0xe9, 0x2f, 0xf5, 0x31, 0xca, 0x3d, 0x6a, 0x87, 0x3f, 0x2b, 0x75, - 0x1d, 0x5e, 0xba, 0x41, 0xee, 0xc9, 0x9b, 0x3d, 0x0b, 0xa7, 0x5c, 0x9f, 0xdd, 0x3d, 0xb6, 0xd2, - 0x5e, 0x13, 0x45, 0x75, 0x78, 0xe5, 0x48, 0x95, 0x84, 0x30, 0x9f, 0x82, 0xe3, 0x8e, 0x27, 0x1e, - 0xc0, 0x24, 0xcc, 0xc3, 0x0d, 0xe9, 0x01, 0x25, 0xf7, 0x12, 0x9c, 0x95, 0x43, 0xb1, 0xe1, 0x84, - 0xa4, 0x2e, 0x94, 0x6d, 0x24, 0xd2, 0x4e, 0xce, 0xf1, 0xd4, 0x95, 0x0c, 0x04, 0x9c, 0xfd, 0x1c, - 0xbb, 0xee, 0x29, 0x68, 0xb9, 0x35, 0xb1, 0x15, 0xd4, 0xd7, 0x3d, 0xd1, 0x46, 0xcc, 0x61, 0x5a, - 0x5f, 0x54, 0x4f, 0x46, 0x5f, 0x7c, 0x04, 0xaa, 0x6a, 0xbc, 0x79, 0xb0, 0xbd, 0x9a, 0xe4, 0x1d, - 0xc1, 0xf6, 0x6a, 0x86, 0x1b, 0x58, 0xfb, 0xdd, 0x47, 0xfa, 0x6e, 0x18, 0x54, 0xde, 0xaf, 0x5e, - 0x2f, 0xdd, 0xb2, 0xbf, 0xd2, 0x07, 0x43, 0x89, 0x42, 0x9a, 0x09, 0xb7, 0xb7, 0xb5, 0xaf, 0xdb, - 0x9b, 0x25, 0x4f, 0xb4, 0x7d, 0x79, 0x23, 0x9f, 0x91, 0x3c, 0xd1, 0xf6, 0x09, 0xe6, 0x30, 0xba, - 0xe9, 0xa8, 0x87, 0x3b, 0xb8, 0xed, 0x8b, 0x20, 0x67, 0xb5, 0xe9, 0x98, 0x65, 0xad, 0x58, 0x40, - 0xd1, 0x27, 0x2d, 0x18, 0x8c, 0xd8, 0x99, 0x0a, 0x3f, 0x34, 0x10, 0x93, 0xfc, 0xea, 0xd1, 0xeb, - 0x84, 0xaa, 0xa2, 0xb1, 0x2c, 0x6e, 0xc9, 0x6c, 0xc1, 0x09, 0x8e, 0xe8, 0x33, 0x16, 0x54, 0xd5, - 0xc5, 0x41, 0xe2, 0x7a, 0xcd, 0x95, 0x7c, 0xeb, 0x94, 0x72, 0x6f, 0xb3, 0x3a, 0x9e, 0x52, 0x05, - 0x23, 0xb1, 0x66, 0x8c, 0x22, 0xe5, 0xd1, 0xef, 0x3f, 0x1e, 0x8f, 0x3e, 0x64, 0x78, 0xf3, 0xdf, - 0x05, 0xd5, 0xa6, 0xe3, 0xbb, 0xeb, 0x24, 0x8a, 0xb9, 0x93, 0x5d, 0x96, 0x4f, 0x96, 0x8d, 0x58, - 0xc3, 0xa9, 0x01, 0x10, 0xb1, 0x17, 0x8b, 0x0d, 0xaf, 0x38, 0x33, 0x00, 0x56, 0x74, 0x33, 0x36, - 0x71, 0x4c, 0x17, 0x3e, 0xdc, 0x57, 0x17, 0xfe, 0xc0, 0xde, 0x2e, 0x7c, 0xfb, 0xef, 0x59, 0x70, - 0x36, 0xf3, 0xab, 0x3d, 0xb8, 0xe1, 0xa8, 0xf6, 0x57, 0xcb, 0x70, 0x3a, 0xa3, 0x22, 0x2e, 0xda, - 0x31, 0xe7, 0xb3, 0x95, 0x47, 0x64, 0x47, 0x32, 0x50, 0x41, 0x0e, 0x63, 0xc6, 0x24, 0x3e, 0xd8, - 0x01, 0x9a, 0x3e, 0xc4, 0x2a, 0x9e, 0xec, 0x21, 0x96, 0x31, 0x2d, 0x4b, 0xf7, 0x75, 0x5a, 0x96, - 0xf7, 0x39, 0x59, 0xfa, 0x96, 0x05, 0x63, 0xcd, 0x2e, 0xd7, 0x30, 0x08, 0x77, 0xf0, 0xcd, 0xe3, - 0xb9, 0xe4, 0x61, 0xfa, 0x91, 0xbb, 0xbb, 0xe3, 0x5d, 0x6f, 0xbf, 0xc0, 0x5d, 0x7b, 0x65, 0x7f, - 0xaf, 0x08, 0xac, 0x1c, 0x33, 0xab, 0x7a, 0xb8, 0x83, 0x3e, 0x61, 0x16, 0xd6, 0xb6, 0xf2, 0x2a, - 0x02, 0xcd, 0x89, 0xab, 0xc2, 0xdc, 0x7c, 0x04, 0xb3, 0xea, 0x74, 0xa7, 0x85, 0x56, 0xa1, 0x07, - 0xa1, 0xe5, 0xc9, 0x0a, 0xe6, 0xc5, 0xfc, 0x2b, 0x98, 0x57, 0xd3, 0xd5, 0xcb, 0xf7, 0xfe, 0xc4, - 0xa5, 0x07, 0xf2, 0x13, 0xff, 0xb2, 0xc5, 0x05, 0x4f, 0xea, 0x2b, 0x68, 0xcb, 0xc0, 0xda, 0xc3, - 0x32, 0x78, 0x0a, 0x2a, 0x11, 0xf1, 0xd6, 0xaf, 0x10, 0xc7, 0x13, 0x16, 0x84, 0x8e, 0x2a, 0x10, - 0xed, 0x58, 0x61, 0xb0, 0x2b, 0x8e, 0x3d, 0x2f, 0xb8, 0x73, 0xa9, 0xd9, 0x8a, 0x77, 0x84, 0x2d, - 0xa1, 0xaf, 0x38, 0x56, 0x10, 0x6c, 0x60, 0xd9, 0x7f, 0xa3, 0xc0, 0x67, 0xa0, 0x08, 0x4d, 0x79, - 0x3e, 0x75, 0x29, 0x65, 0xef, 0x51, 0x1d, 0x1f, 0x03, 0xa8, 0x05, 0xcd, 0x16, 0xb5, 0x33, 0x57, - 0x03, 0x71, 0x52, 0x77, 0xe5, 0xc8, 0x57, 0xe0, 0x0b, 0x7a, 0xfa, 0x35, 0x74, 0x1b, 0x36, 0xf8, - 0x25, 0x64, 0x69, 0x71, 0x5f, 0x59, 0x9a, 0x10, 0x2b, 0xa5, 0x7d, 0xb4, 0xdd, 0x9f, 0x5b, 0x90, - 0xb0, 0x88, 0x50, 0x0b, 0xca, 0xb4, 0xbb, 0x3b, 0x62, 0x85, 0x2e, 0xe5, 0x67, 0x7e, 0x51, 0xd1, - 0x28, 0xa6, 0x3d, 0xfb, 0x89, 0x39, 0x23, 0xe4, 0x89, 0x08, 0x16, 0x3e, 0xaa, 0xd7, 0xf3, 0x63, - 0x78, 0x25, 0x08, 0x36, 0xf9, 0x71, 0xb3, 0x8e, 0x86, 0xb1, 0x9f, 0x87, 0xd1, 0x8e, 0x4e, 0xb1, - 0xfb, 0xe7, 0x02, 0xaa, 0x7d, 0x52, 0xd3, 0x95, 0xa5, 0xd5, 0x62, 0x0e, 0xb3, 0xdf, 0xb4, 0xe0, - 0x54, 0x9a, 0x3c, 0x7a, 0xc3, 0x82, 0xd1, 0x28, 0x4d, 0xef, 0xb8, 0xc6, 0x4e, 0x45, 0xa1, 0x76, - 0x80, 0x70, 0x67, 0x27, 0xec, 0xff, 0x2b, 0x26, 0xff, 0x2d, 0xd7, 0xaf, 0x07, 0x77, 0x94, 0x61, - 0x62, 0x75, 0x35, 0x4c, 0xe8, 0x7a, 0xac, 0x6d, 0x90, 0x7a, 0xdb, 0xeb, 0xc8, 0xe7, 0x5d, 0x11, - 0xed, 0x58, 0x61, 0xb0, 0xf4, 0xc5, 0xb6, 0xb8, 0xe2, 0x20, 0x35, 0x29, 0x67, 0x45, 0x3b, 0x56, - 0x18, 0xe8, 0x59, 0x18, 0x34, 0x5e, 0x52, 0xce, 0x4b, 0x66, 0x90, 0x1b, 0x2a, 0x33, 0xc2, 0x09, - 0x2c, 0x34, 0x01, 0xa0, 0x8c, 0x1c, 0xa9, 0x22, 0x99, 0x63, 0x4a, 0x49, 0xa2, 0x08, 0x1b, 0x18, - 0x2c, 0x59, 0xd8, 0x6b, 0x47, 0xec, 0xe4, 0xa5, 0x4f, 0x97, 0xdd, 0x9d, 0x11, 0x6d, 0x58, 0x41, - 0xa9, 0x34, 0x69, 0x3a, 0x7e, 0xdb, 0xf1, 0xe8, 0x08, 0x89, 0xad, 0xa6, 0x5a, 0x86, 0x8b, 0x0a, - 0x82, 0x0d, 0x2c, 0xfa, 0xc6, 0xb1, 0xdb, 0x24, 0x2f, 0x05, 0xbe, 0x8c, 0x1e, 0xd4, 0x87, 0x71, - 0xa2, 0x1d, 0x2b, 0x0c, 0xfb, 0x3f, 0x5b, 0x30, 0xa2, 0x4b, 0x0f, 0xf0, 0x9b, 0xe6, 0xcd, 0x9d, - 0xb1, 0xb5, 0xef, 0xce, 0x38, 0x99, 0x93, 0x5d, 0xe8, 0x29, 0x27, 0xdb, 0x4c, 0x97, 0x2e, 0xee, - 0x99, 0x2e, 0xfd, 0x63, 0xfa, 0x16, 0x63, 0x9e, 0x57, 0x3d, 0x90, 0x75, 0x83, 0x31, 0xb2, 0xa1, - 0xaf, 0xe6, 0xa8, 0xba, 0x3b, 0x83, 0x7c, 0xef, 0x30, 0x33, 0xc5, 0x90, 0x04, 0xc4, 0x5e, 0x82, - 0xaa, 0x3a, 0x93, 0x92, 0x1b, 0x55, 0x2b, 0x7b, 0xa3, 0xda, 0x53, 0xda, 0xe6, 0xf4, 0xda, 0xb7, - 0xbf, 0xff, 0xd8, 0xdb, 0xfe, 0xe0, 0xfb, 0x8f, 0xbd, 0xed, 0x8f, 0xbf, 0xff, 0xd8, 0xdb, 0x3e, - 0x79, 0xf7, 0x31, 0xeb, 0xdb, 0x77, 0x1f, 0xb3, 0xfe, 0xe0, 0xee, 0x63, 0xd6, 0x1f, 0xdf, 0x7d, - 0xcc, 0xfa, 0xde, 0xdd, 0xc7, 0xac, 0x2f, 0xff, 0x87, 0xc7, 0xde, 0xf6, 0x52, 0x66, 0xf8, 0x28, + 0xca, 0x28, 0xb1, 0xb6, 0x22, 0xda, 0xb1, 0xc2, 0xb0, 0xbf, 0xc1, 0x8e, 0xbd, 0x8d, 0x1c, 0x70, + 0x3a, 0x27, 0x3c, 0x76, 0x1b, 0x36, 0xaf, 0xcf, 0xa6, 0xe6, 0x04, 0xbf, 0x02, 0x9b, 0xc3, 0xd0, + 0x1d, 0xe8, 0x5f, 0xe3, 0xd7, 0x41, 0xe6, 0x53, 0x22, 0x5f, 0xdc, 0x2d, 0xc9, 0x2e, 0xda, 0x91, + 0x17, 0x4d, 0xde, 0xd3, 0x3f, 0xb1, 0xe4, 0x66, 0x7f, 0xbb, 0x0c, 0x23, 0xa9, 0xfb, 0x92, 0x13, + 0x95, 0x71, 0x0b, 0xfb, 0x56, 0xc6, 0xfd, 0x30, 0x40, 0x9d, 0xb4, 0xbc, 0x60, 0x87, 0x99, 0x63, + 0xa5, 0x03, 0x9b, 0x63, 0xca, 0x82, 0x9f, 0x55, 0x54, 0xb0, 0x41, 0x51, 0x14, 0xa5, 0xe3, 0x85, + 0x76, 0x53, 0x45, 0xe9, 0x8c, 0x8b, 0x34, 0xfa, 0x4e, 0xf6, 0x22, 0x0d, 0x17, 0x46, 0x78, 0x17, + 0x55, 0xa6, 0xf5, 0x21, 0x12, 0xaa, 0x59, 0xae, 0xca, 0x6c, 0x92, 0x0c, 0x4e, 0xd3, 0xbd, 0x9f, + 0xd7, 0xa1, 0xa3, 0x77, 0x42, 0x55, 0x7e, 0xe7, 0x68, 0xac, 0xaa, 0xab, 0x55, 0xc8, 0x69, 0xc0, + 0xae, 0x29, 0x17, 0x3f, 0x3b, 0x8a, 0x46, 0xc0, 0xfd, 0x2a, 0x1a, 0x61, 0x7f, 0xb1, 0x40, 0xed, + 0x78, 0xde, 0x2f, 0x55, 0xff, 0xe8, 0x09, 0xe8, 0x73, 0xda, 0xf1, 0x46, 0xd0, 0x71, 0xa1, 0xe4, + 0x14, 0x6b, 0xc5, 0x02, 0x8a, 0x16, 0xa0, 0x54, 0xd7, 0x35, 0x6d, 0x0e, 0xf2, 0x3d, 0xb5, 0x4b, + 0xd4, 0x89, 0x09, 0x66, 0x54, 0xd0, 0x23, 0x50, 0x8a, 0x9d, 0x86, 0x4c, 0xaf, 0x63, 0x29, 0xd5, + 0xab, 0x4e, 0x23, 0xc2, 0xac, 0xd5, 0x54, 0xdf, 0xa5, 0x7d, 0xd4, 0xf7, 0x0b, 0x30, 0x14, 0xb9, + 0x0d, 0xdf, 0x89, 0xdb, 0x21, 0x31, 0x8e, 0xf9, 0x74, 0x90, 0x87, 0x09, 0xc4, 0x49, 0x5c, 0xfb, + 0x77, 0x06, 0xe1, 0xcc, 0xca, 0xcc, 0xa2, 0xac, 0xd4, 0x7e, 0x6c, 0x19, 0x72, 0x59, 0x3c, 0x4e, + 0x2e, 0x43, 0xae, 0x0b, 0x77, 0xcf, 0xc8, 0x90, 0xf3, 0x8c, 0x0c, 0xb9, 0x64, 0xba, 0x52, 0x31, + 0x8f, 0x74, 0xa5, 0xac, 0x1e, 0xf4, 0x92, 0xae, 0x74, 0x6c, 0x29, 0x73, 0x7b, 0x76, 0xe8, 0x40, + 0x29, 0x73, 0x2a, 0x9f, 0x30, 0x97, 0x44, 0x92, 0x2e, 0x9f, 0x2a, 0x33, 0x9f, 0x50, 0xe5, 0x72, + 0xf1, 0x24, 0x29, 0x21, 0xea, 0x5f, 0xce, 0xbf, 0x03, 0x3d, 0xe4, 0x72, 0x89, 0x3c, 0x2d, 0x33, + 0x7f, 0xb0, 0x3f, 0x8f, 0xfc, 0xc1, 0xac, 0xee, 0xec, 0x9b, 0x3f, 0xf8, 0x02, 0x0c, 0xd5, 0xbc, + 0xc0, 0x27, 0xcb, 0x61, 0x10, 0x07, 0xb5, 0xc0, 0x13, 0x66, 0xbd, 0xbe, 0x39, 0xc6, 0x04, 0xe2, + 0x24, 0x6e, 0xb7, 0xe4, 0xc3, 0xea, 0x51, 0x93, 0x0f, 0xe1, 0x3e, 0x25, 0x1f, 0xfe, 0x82, 0x4e, + 0x93, 0x1f, 0x60, 0x5f, 0xe4, 0xc3, 0xf9, 0x7f, 0x91, 0x5e, 0x72, 0xe5, 0xd1, 0x9b, 0xfc, 0x46, + 0x47, 0x6a, 0x18, 0xcf, 0x04, 0x4d, 0x6a, 0xf8, 0x0d, 0xb2, 0x21, 0x79, 0xe5, 0x18, 0x26, 0xec, + 0xad, 0x15, 0xcd, 0x46, 0xdd, 0xf2, 0xa8, 0x9b, 0x70, 0xb2, 0x23, 0x47, 0x49, 0xe3, 0xff, 0x4a, + 0x01, 0x7e, 0x64, 0xdf, 0x2e, 0xa0, 0x3b, 0x00, 0xb1, 0xd3, 0x10, 0x13, 0x55, 0x1c, 0x98, 0x1c, + 0x31, 0x12, 0x73, 0x55, 0xd2, 0xe3, 0xf5, 0x67, 0xd4, 0x5f, 0x76, 0x14, 0x21, 0x7f, 0xb3, 0x00, + 0xcc, 0xc0, 0xeb, 0x28, 0xd3, 0x89, 0x03, 0x8f, 0x60, 0x06, 0xa1, 0xea, 0x3f, 0x24, 0x0d, 0x7d, + 0x1d, 0xba, 0xfa, 0x7c, 0x98, 0xb5, 0x62, 0x01, 0x45, 0xcf, 0xc1, 0x80, 0xe3, 0x79, 0x3c, 0xcb, + 0x87, 0x44, 0xe2, 0x4a, 0x27, 0x5d, 0x2f, 0x50, 0x83, 0xb0, 0x89, 0x67, 0xff, 0x79, 0x01, 0xc6, + 0xf7, 0x91, 0x29, 0x1d, 0xd9, 0x9d, 0xe5, 0x9e, 0xb3, 0x3b, 0x45, 0xe6, 0x43, 0x5f, 0x97, 0xcc, + 0x87, 0xe7, 0x60, 0x20, 0x26, 0x4e, 0x53, 0xc4, 0x6e, 0x09, 0x4f, 0x80, 0x3e, 0x01, 0xd6, 0x20, + 0x6c, 0xe2, 0x51, 0x29, 0x36, 0xec, 0xd4, 0x6a, 0x24, 0x8a, 0x64, 0x6a, 0x83, 0xf0, 0xa6, 0xe6, + 0x96, 0x37, 0xc1, 0x9c, 0xd4, 0x53, 0x09, 0x16, 0x38, 0xc5, 0x32, 0x3d, 0xe0, 0xd5, 0x1e, 0x07, + 0xfc, 0xeb, 0x05, 0x78, 0x74, 0x4f, 0xed, 0xd6, 0x73, 0xd6, 0x49, 0x3b, 0x22, 0x61, 0x7a, 0xe2, + 0xdc, 0x88, 0x48, 0x88, 0x19, 0x84, 0x8f, 0x52, 0xab, 0x65, 0x5c, 0x37, 0x9f, 0x77, 0x0a, 0x16, + 0x1f, 0xa5, 0x04, 0x0b, 0x9c, 0x62, 0x79, 0xd8, 0x69, 0xf9, 0xed, 0x12, 0x3c, 0xde, 0x83, 0x0d, + 0x90, 0x63, 0xaa, 0x5a, 0x32, 0xad, 0xb2, 0x78, 0x9f, 0xd2, 0x2a, 0x0f, 0x37, 0x5c, 0x6f, 0x65, + 0x63, 0xf6, 0x94, 0x12, 0xf7, 0x8d, 0x02, 0x9c, 0xef, 0x6e, 0xb0, 0xa0, 0xf7, 0xc2, 0x48, 0xa8, + 0x62, 0xd5, 0xcc, 0x8c, 0xcc, 0xd3, 0xdc, 0xdf, 0x92, 0x00, 0xe1, 0x34, 0x2e, 0x9a, 0x00, 0x68, + 0x39, 0xf1, 0x46, 0x74, 0x69, 0xdb, 0x8d, 0x62, 0x51, 0x97, 0x69, 0x98, 0x9f, 0xf0, 0xc9, 0x56, + 0x6c, 0x60, 0x50, 0x76, 0xec, 0xdf, 0x6c, 0x70, 0x3d, 0x88, 0xf9, 0x43, 0x7c, 0xb3, 0x75, 0x5a, + 0xde, 0x62, 0x63, 0x80, 0x70, 0x1a, 0x97, 0xb2, 0x63, 0x67, 0xc8, 0xbc, 0xa3, 0x7c, 0x17, 0xc6, + 0xd8, 0x2d, 0xa8, 0x56, 0x6c, 0x60, 0xa4, 0x73, 0x4d, 0xcb, 0xfb, 0xe7, 0x9a, 0xda, 0xff, 0xb0, + 0x00, 0xe7, 0xba, 0x1a, 0xbc, 0xbd, 0x89, 0xa9, 0x07, 0x2f, 0x3f, 0xf4, 0x90, 0x2b, 0xec, 0x60, + 0x79, 0x85, 0x7f, 0xd2, 0x65, 0xa6, 0x89, 0xbc, 0xc2, 0xc3, 0x97, 0x4b, 0x78, 0xf0, 0xc6, 0xb3, + 0x23, 0x95, 0xb0, 0x74, 0x80, 0x54, 0xc2, 0xd4, 0xc7, 0x28, 0xf7, 0xa8, 0x1d, 0xfe, 0xac, 0xd4, + 0x75, 0x78, 0xe9, 0x06, 0xb9, 0x27, 0x6f, 0xf6, 0x2c, 0x9c, 0x72, 0x7d, 0x76, 0xa3, 0xd9, 0x4a, + 0x7b, 0x4d, 0x94, 0xea, 0xe1, 0xf5, 0x28, 0x55, 0xbe, 0xc2, 0x7c, 0x0a, 0x8e, 0x3b, 0x9e, 0x78, + 0x00, 0x53, 0x3b, 0x0f, 0x37, 0xa4, 0x07, 0x94, 0xdc, 0x4b, 0x70, 0x56, 0x0e, 0xc5, 0x86, 0x13, + 0x92, 0xba, 0x50, 0xb6, 0x91, 0xc8, 0x50, 0x39, 0xc7, 0xb3, 0x5c, 0x32, 0x10, 0x70, 0xf6, 0x73, + 0xec, 0x12, 0xa9, 0xa0, 0xe5, 0xd6, 0xc4, 0x56, 0x50, 0x5f, 0x22, 0x45, 0x1b, 0x31, 0x87, 0x69, + 0x7d, 0x51, 0x3d, 0x19, 0x7d, 0xf1, 0x61, 0xa8, 0xaa, 0xf1, 0xe6, 0xc1, 0xf6, 0x6a, 0x92, 0x77, + 0x04, 0xdb, 0xab, 0x19, 0x6e, 0x60, 0xed, 0x77, 0xcb, 0xe9, 0xbb, 0x60, 0x50, 0x79, 0xbf, 0x7a, + 0xbd, 0xca, 0xcb, 0x7e, 0xa3, 0x0f, 0x86, 0x12, 0xe5, 0x39, 0x13, 0x6e, 0x6f, 0x6b, 0x5f, 0xb7, + 0x37, 0xcb, 0xb3, 0x68, 0xfb, 0xf2, 0x9e, 0x3f, 0x23, 0xcf, 0xa2, 0xed, 0x13, 0xcc, 0x61, 0x74, + 0xd3, 0x51, 0x0f, 0x77, 0x70, 0xdb, 0x17, 0x41, 0xce, 0x6a, 0xd3, 0x31, 0xcb, 0x5a, 0xb1, 0x80, + 0xa2, 0x4f, 0x58, 0x30, 0x18, 0xb1, 0x33, 0x15, 0x7e, 0x68, 0x20, 0x26, 0xf9, 0xd5, 0xa3, 0x57, + 0x1f, 0x55, 0xa5, 0x68, 0x59, 0xdc, 0x92, 0xd9, 0x82, 0x13, 0x1c, 0xd1, 0xa7, 0x2d, 0xa8, 0xaa, + 0xeb, 0x88, 0xc4, 0xa5, 0x9d, 0x2b, 0xf9, 0x56, 0x3f, 0xe5, 0xde, 0x66, 0x75, 0x3c, 0xa5, 0xca, + 0x50, 0x62, 0xcd, 0x18, 0x45, 0xca, 0xa3, 0xdf, 0x7f, 0x3c, 0x1e, 0x7d, 0xc8, 0xf0, 0xe6, 0xbf, + 0x13, 0xaa, 0x4d, 0xc7, 0x77, 0xd7, 0x49, 0x14, 0x73, 0x27, 0xbb, 0x2c, 0xca, 0x2c, 0x1b, 0xb1, + 0x86, 0x53, 0x03, 0x20, 0x62, 0x2f, 0x16, 0x1b, 0x5e, 0x71, 0x66, 0x00, 0xac, 0xe8, 0x66, 0x6c, + 0xe2, 0x98, 0x2e, 0x7c, 0xb8, 0xaf, 0x2e, 0xfc, 0x81, 0xbd, 0x5d, 0xf8, 0xf6, 0xdf, 0xb3, 0xe0, + 0x6c, 0xe6, 0x57, 0x7b, 0x70, 0xc3, 0x51, 0xed, 0x2f, 0x97, 0xe1, 0x74, 0x46, 0x9d, 0x5d, 0xb4, + 0x63, 0xce, 0x67, 0x2b, 0x8f, 0xc8, 0x8e, 0x64, 0xa0, 0x82, 0x1c, 0xc6, 0x8c, 0x49, 0x7c, 0xb0, + 0x03, 0x34, 0x7d, 0x88, 0x55, 0x3c, 0xd9, 0x43, 0x2c, 0x63, 0x5a, 0x96, 0xee, 0xeb, 0xb4, 0x2c, + 0xef, 0x73, 0xb2, 0xf4, 0x4d, 0x0b, 0xc6, 0x9a, 0x5d, 0x2e, 0x77, 0x10, 0xee, 0xe0, 0x9b, 0xc7, + 0x73, 0x75, 0xc4, 0xf4, 0x23, 0x77, 0x77, 0xc7, 0xbb, 0xde, 0xa9, 0x81, 0xbb, 0xf6, 0xca, 0xfe, + 0x5e, 0x11, 0x58, 0x91, 0x67, 0x56, 0x4b, 0x71, 0x07, 0x7d, 0xdc, 0x2c, 0xd7, 0x6d, 0xe5, 0x55, + 0x5a, 0x9a, 0x13, 0x57, 0xe5, 0xbe, 0xf9, 0x08, 0x66, 0x55, 0xff, 0x4e, 0x0b, 0xad, 0x42, 0x0f, + 0x42, 0xcb, 0x93, 0x75, 0xd1, 0x8b, 0xf9, 0xd7, 0x45, 0xaf, 0xa6, 0x6b, 0xa2, 0xef, 0xfd, 0x89, + 0x4b, 0x0f, 0xe4, 0x27, 0xfe, 0x15, 0x8b, 0x0b, 0x9e, 0xd4, 0x57, 0xd0, 0x96, 0x81, 0xb5, 0x87, + 0x65, 0xf0, 0x14, 0x54, 0x22, 0xe2, 0xad, 0x5f, 0x21, 0x8e, 0x27, 0x2c, 0x08, 0x1d, 0x55, 0x20, + 0xda, 0xb1, 0xc2, 0x60, 0x17, 0x27, 0x7b, 0x5e, 0x70, 0xe7, 0x52, 0xb3, 0x15, 0xef, 0x08, 0x5b, + 0x42, 0x5f, 0x9c, 0xac, 0x20, 0xd8, 0xc0, 0xb2, 0xff, 0x46, 0x81, 0xcf, 0x40, 0x11, 0x9a, 0xf2, + 0x7c, 0xea, 0xaa, 0xcb, 0xde, 0xa3, 0x3a, 0x3e, 0x0a, 0x50, 0x0b, 0x9a, 0x2d, 0x6a, 0x67, 0xae, + 0x06, 0xe2, 0xa4, 0xee, 0xca, 0x91, 0x2f, 0xd6, 0x17, 0xf4, 0xf4, 0x6b, 0xe8, 0x36, 0x6c, 0xf0, + 0x4b, 0xc8, 0xd2, 0xe2, 0xbe, 0xb2, 0x34, 0x21, 0x56, 0x4a, 0xfb, 0x68, 0xbb, 0x3f, 0xb7, 0x20, + 0x61, 0x11, 0xa1, 0x16, 0x94, 0x69, 0x77, 0x77, 0xc4, 0x0a, 0x5d, 0xca, 0xcf, 0xfc, 0xa2, 0xa2, + 0x51, 0x4c, 0x7b, 0xf6, 0x13, 0x73, 0x46, 0xc8, 0x13, 0x11, 0x2c, 0x7c, 0x54, 0xaf, 0xe7, 0xc7, + 0xf0, 0x4a, 0x10, 0x6c, 0xf2, 0xe3, 0x66, 0x1d, 0x0d, 0x63, 0x3f, 0x0f, 0xa3, 0x1d, 0x9d, 0x62, + 0xb7, 0xda, 0x05, 0x54, 0xfb, 0xa4, 0xa6, 0x2b, 0xcb, 0xc0, 0xc5, 0x1c, 0x66, 0x7f, 0xc3, 0x82, + 0x53, 0x69, 0xf2, 0xe8, 0x4d, 0x0b, 0x46, 0xa3, 0x34, 0xbd, 0xe3, 0x1a, 0x3b, 0x15, 0x85, 0xda, + 0x01, 0xc2, 0x9d, 0x9d, 0xb0, 0xff, 0xaf, 0x98, 0xfc, 0xb7, 0x5c, 0xbf, 0x1e, 0xdc, 0x51, 0x86, + 0x89, 0xd5, 0xd5, 0x30, 0xa1, 0xeb, 0xb1, 0xb6, 0x41, 0xea, 0x6d, 0xaf, 0x23, 0x9f, 0x77, 0x45, + 0xb4, 0x63, 0x85, 0xc1, 0xd2, 0x17, 0xdb, 0xe2, 0xe2, 0x84, 0xd4, 0xa4, 0x9c, 0x15, 0xed, 0x58, + 0x61, 0xa0, 0x67, 0x61, 0xd0, 0x78, 0x49, 0x39, 0x2f, 0x99, 0x41, 0x6e, 0xa8, 0xcc, 0x08, 0x27, + 0xb0, 0xd0, 0x04, 0x80, 0x32, 0x72, 0xa4, 0x8a, 0x64, 0x8e, 0x29, 0x25, 0x89, 0x22, 0x6c, 0x60, + 0xb0, 0x64, 0x61, 0xaf, 0x1d, 0xb1, 0x93, 0x97, 0x3e, 0x5d, 0xcc, 0x77, 0x46, 0xb4, 0x61, 0x05, + 0xa5, 0xd2, 0xa4, 0xe9, 0xf8, 0x6d, 0xc7, 0xa3, 0x23, 0x24, 0xb6, 0x9a, 0x6a, 0x19, 0x2e, 0x2a, + 0x08, 0x36, 0xb0, 0xe8, 0x1b, 0xc7, 0x6e, 0x93, 0xbc, 0x14, 0xf8, 0x32, 0x7a, 0x50, 0x1f, 0xc6, + 0x89, 0x76, 0xac, 0x30, 0xec, 0xff, 0x6c, 0xc1, 0x88, 0xae, 0x52, 0xc0, 0xef, 0xaf, 0x37, 0x77, + 0xc6, 0xd6, 0xbe, 0x3b, 0xe3, 0x64, 0x4e, 0x76, 0xa1, 0xa7, 0x9c, 0x6c, 0x33, 0x5d, 0xba, 0xb8, + 0x67, 0xba, 0xf4, 0x8f, 0xe9, 0xbb, 0x91, 0x79, 0x5e, 0xf5, 0x40, 0xd6, 0xbd, 0xc8, 0xc8, 0x86, + 0xbe, 0x9a, 0xa3, 0xaa, 0xf9, 0x0c, 0xf2, 0xbd, 0xc3, 0xcc, 0x14, 0x43, 0x12, 0x10, 0x7b, 0x09, + 0xaa, 0xea, 0x4c, 0x4a, 0x6e, 0x54, 0xad, 0xec, 0x8d, 0x6a, 0x4f, 0x69, 0x9b, 0xd3, 0x6b, 0xdf, + 0xfa, 0xfe, 0x63, 0x6f, 0xfb, 0xc3, 0xef, 0x3f, 0xf6, 0xb6, 0xef, 0x7e, 0xff, 0xb1, 0xb7, 0x7d, + 0xe2, 0xee, 0x63, 0xd6, 0xb7, 0xee, 0x3e, 0x66, 0xfd, 0xe1, 0xdd, 0xc7, 0xac, 0xef, 0xde, 0x7d, + 0xcc, 0xfa, 0xde, 0xdd, 0xc7, 0xac, 0x2f, 0xfd, 0x87, 0xc7, 0xde, 0xf6, 0x52, 0x66, 0xf8, 0x28, 0xfd, 0xf1, 0x74, 0xad, 0x3e, 0xb9, 0x75, 0x91, 0x45, 0x30, 0xd2, 0xe5, 0x35, 0x69, 0xcc, 0xa9, - 0x49, 0xb9, 0xbc, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0x2b, 0x4e, 0xfa, 0x47, 0xe8, + 0x49, 0xb9, 0xbc, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0xb4, 0xbc, 0x17, 0x9d, 0xe8, 0x00, 0x00, } @@ -11829,6 +11830,13 @@ func (m *RepoCreds) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.NoProxy) + copy(dAtA[i:], m.NoProxy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NoProxy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba i-- if m.ForceHttpBasicAuth { dAtA[i] = 1 @@ -11980,6 +11988,13 @@ func (m *Repository) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.NoProxy) + copy(dAtA[i:], m.NoProxy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NoProxy))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba i-- if m.ForceHttpBasicAuth { dAtA[i] = 1 @@ -17265,6 +17280,8 @@ func (m *RepoCreds) Size() (n int) { l = len(m.Proxy) n += 2 + l + sovGenerated(uint64(l)) n += 3 + l = len(m.NoProxy) + n += 2 + l + sovGenerated(uint64(l)) return n } @@ -17327,6 +17344,8 @@ func (m *Repository) Size() (n int) { l = len(m.GCPServiceAccountKey) n += 2 + l + sovGenerated(uint64(l)) n += 3 + l = len(m.NoProxy) + n += 2 + l + sovGenerated(uint64(l)) return n } @@ -20210,6 +20229,7 @@ func (this *RepoCreds) String() string { `GCPServiceAccountKey:` + fmt.Sprintf("%v", this.GCPServiceAccountKey) + `,`, `Proxy:` + fmt.Sprintf("%v", this.Proxy) + `,`, `ForceHttpBasicAuth:` + fmt.Sprintf("%v", this.ForceHttpBasicAuth) + `,`, + `NoProxy:` + fmt.Sprintf("%v", this.NoProxy) + `,`, `}`, }, "") return s @@ -20257,6 +20277,7 @@ func (this *Repository) String() string { `Project:` + fmt.Sprintf("%v", this.Project) + `,`, `GCPServiceAccountKey:` + fmt.Sprintf("%v", this.GCPServiceAccountKey) + `,`, `ForceHttpBasicAuth:` + fmt.Sprintf("%v", this.ForceHttpBasicAuth) + `,`, + `NoProxy:` + fmt.Sprintf("%v", this.NoProxy) + `,`, `}`, }, "") return s @@ -42318,6 +42339,38 @@ func (m *RepoCreds) Unmarshal(dAtA []byte) error { } } m.ForceHttpBasicAuth = bool(v != 0) + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NoProxy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NoProxy = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43092,6 +43145,38 @@ func (m *Repository) Unmarshal(dAtA []byte) error { } } m.ForceHttpBasicAuth = bool(v != 0) + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NoProxy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NoProxy = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 345d290ce2f4d4..a95d6b67912e6c 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -1601,6 +1601,9 @@ message RepoCreds { // ForceHttpBasicAuth specifies whether Argo CD should attempt to force basic auth for HTTP connections optional bool forceHttpBasicAuth = 20; + + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + optional string noProxy = 23; } // RepositoryList is a collection of Repositories. @@ -1678,6 +1681,9 @@ message Repository { // ForceHttpBasicAuth specifies whether Argo CD should attempt to force basic auth for HTTP connections optional bool forceHttpBasicAuth = 22; + + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + optional string noProxy = 23; } // A RepositoryCertificate is either SSH known hosts entry or TLS certificate diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 183346db71a505..693720d7dfa37c 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -5668,6 +5668,13 @@ func schema_pkg_apis_application_v1alpha1_RepoCreds(ref common.ReferenceCallback Format: "", }, }, + "noProxy": { + SchemaProps: spec.SchemaProps{ + Description: "NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"url"}, }, @@ -5872,6 +5879,13 @@ func schema_pkg_apis_application_v1alpha1_Repository(ref common.ReferenceCallbac Format: "", }, }, + "noProxy": { + SchemaProps: spec.SchemaProps{ + Description: "NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"repo"}, }, diff --git a/pkg/apis/application/v1alpha1/repository_types.go b/pkg/apis/application/v1alpha1/repository_types.go index 4cdfe3f9f83a07..5a30d24fbcfdb5 100644 --- a/pkg/apis/application/v1alpha1/repository_types.go +++ b/pkg/apis/application/v1alpha1/repository_types.go @@ -45,6 +45,8 @@ type RepoCreds struct { Proxy string `json:"proxy,omitempty" protobuf:"bytes,19,opt,name=proxy"` // ForceHttpBasicAuth specifies whether Argo CD should attempt to force basic auth for HTTP connections ForceHttpBasicAuth bool `json:"forceHttpBasicAuth,omitempty" protobuf:"bytes,20,opt,name=forceHttpBasicAuth"` + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + NoProxy string `json:"noProxy,omitempty" protobuf:"bytes,23,opt,name=noProxy"` } // Repository is a repository holding application configurations @@ -94,6 +96,8 @@ type Repository struct { GCPServiceAccountKey string `json:"gcpServiceAccountKey,omitempty" protobuf:"bytes,21,opt,name=gcpServiceAccountKey"` // ForceHttpBasicAuth specifies whether Argo CD should attempt to force basic auth for HTTP connections ForceHttpBasicAuth bool `json:"forceHttpBasicAuth,omitempty" protobuf:"bytes,22,opt,name=forceHttpBasicAuth"` + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + NoProxy string `json:"noProxy,omitempty" protobuf:"bytes,23,opt,name=noProxy"` } // IsInsecure returns true if the repository has been configured to skip server verification @@ -184,6 +188,9 @@ func (repo *Repository) CopyCredentialsFrom(source *RepoCreds) { if repo.Proxy == "" { repo.Proxy = source.Proxy } + if repo.NoProxy == "" { + repo.NoProxy = source.NoProxy + } repo.ForceHttpBasicAuth = source.ForceHttpBasicAuth } } @@ -194,13 +201,13 @@ func (repo *Repository) GetGitCreds(store git.CredsStore) git.Creds { return git.NopCreds{} } if repo.Password != "" { - return git.NewHTTPSCreds(repo.Username, repo.Password, repo.TLSClientCertData, repo.TLSClientCertKey, repo.IsInsecure(), repo.Proxy, store, repo.ForceHttpBasicAuth) + return git.NewHTTPSCreds(repo.Username, repo.Password, repo.TLSClientCertData, repo.TLSClientCertKey, repo.IsInsecure(), repo.Proxy, repo.NoProxy, store, repo.ForceHttpBasicAuth) } if repo.SSHPrivateKey != "" { - return git.NewSSHCreds(repo.SSHPrivateKey, getCAPath(repo.Repo), repo.IsInsecure(), store, repo.Proxy) + return git.NewSSHCreds(repo.SSHPrivateKey, getCAPath(repo.Repo), repo.IsInsecure(), store, repo.Proxy, repo.NoProxy) } if repo.GithubAppPrivateKey != "" && repo.GithubAppId != 0 && repo.GithubAppInstallationId != 0 { - return git.NewGitHubAppCreds(repo.GithubAppId, repo.GithubAppInstallationId, repo.GithubAppPrivateKey, repo.GitHubAppEnterpriseBaseURL, repo.Repo, repo.TLSClientCertData, repo.TLSClientCertKey, repo.IsInsecure(), repo.Proxy, store) + return git.NewGitHubAppCreds(repo.GithubAppId, repo.GithubAppInstallationId, repo.GithubAppPrivateKey, repo.GitHubAppEnterpriseBaseURL, repo.Repo, repo.TLSClientCertData, repo.TLSClientCertKey, repo.IsInsecure(), repo.Proxy, repo.NoProxy, store) } if repo.GCPServiceAccountKey != "" { return git.NewGoogleCloudCreds(repo.GCPServiceAccountKey, store) diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index e87ea008ae3518..487053a59f35df 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -1268,6 +1268,7 @@ func TestRepository_CopyCredentialsFrom(t *testing.T) { {"SourceSSHPrivateKey", &Repository{}, &RepoCreds{SSHPrivateKey: "foo"}, Repository{SSHPrivateKey: "foo"}}, {"SourceTLSClientCertData", &Repository{}, &RepoCreds{TLSClientCertData: "foo"}, Repository{TLSClientCertData: "foo"}}, {"SourceTLSClientCertKey", &Repository{}, &RepoCreds{TLSClientCertKey: "foo"}, Repository{TLSClientCertKey: "foo"}}, + {"SourceContainsProxy", &Repository{}, &RepoCreds{Proxy: "http://proxy.argoproj.io:3128", NoProxy: ".example.com"}, Repository{Proxy: "http://proxy.argoproj.io:3128", NoProxy: ".example.com"}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index a729ca1b1af519..80e89c29edce97 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -91,8 +91,8 @@ type Service struct { parallelismLimitSemaphore *semaphore.Weighted metricsServer *metrics.MetricsServer resourceTracking argo.ResourceTracking - newGitClient func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (git.Client, error) - newHelmClient func(repoURL string, creds helm.Creds, enableOci bool, proxy string, opts ...helm.ClientOpts) helm.Client + newGitClient func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...git.ClientOpts) (git.Client, error) + newHelmClient func(repoURL string, creds helm.Creds, enableOci bool, proxy string, noProxy string, opts ...helm.ClientOpts) helm.Client initConstants RepoServerInitConstants // now is usually just time.Now, but may be replaced by unit tests for testing purposes now func() time.Time @@ -131,8 +131,8 @@ func NewService(metricsServer *metrics.MetricsServer, cache *cache.Cache, initCo metricsServer: metricsServer, newGitClient: git.NewClientExt, resourceTracking: resourceTracking, - newHelmClient: func(repoURL string, creds helm.Creds, enableOci bool, proxy string, opts ...helm.ClientOpts) helm.Client { - return helm.NewClientWithLock(repoURL, creds, sync.NewKeyLock(), enableOci, proxy, opts...) + newHelmClient: func(repoURL string, creds helm.Creds, enableOci bool, proxy string, noProxy string, opts ...helm.ClientOpts) helm.Client { + return helm.NewClientWithLock(repoURL, creds, sync.NewKeyLock(), enableOci, proxy, noProxy, opts...) }, initConstants: initConstants, now: time.Now, @@ -1209,7 +1209,7 @@ func helmTemplate(appPath string, repoRoot string, env *v1alpha1.Env, q *apiclie return nil, "", fmt.Errorf("error getting helm repos: %w", err) } - h, err := helm.NewHelmApp(appPath, helmRepos, isLocal, version, proxy, passCredentials) + h, err := helm.NewHelmApp(appPath, helmRepos, isLocal, version, proxy, q.Repo.NoProxy, passCredentials) if err != nil { return nil, "", fmt.Errorf("error initializing helm app object: %w", err) } @@ -1436,7 +1436,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, if q.KustomizeOptions != nil { kustomizeBinary = q.KustomizeOptions.BinaryPath } - k := kustomize.NewKustomizeApp(repoRoot, appPath, q.Repo.GetGitCreds(gitCredsStore), repoURL, kustomizeBinary) + k := kustomize.NewKustomizeApp(repoRoot, appPath, q.Repo.GetGitCreds(gitCredsStore), repoURL, kustomizeBinary, q.Repo.Proxy, q.Repo.NoProxy) targetObjs, _, commands, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env, &kustomize.BuildOpts{ KubeVersion: text.SemVer(q.ApplicationSource.GetKubeVersionOrDefault(q.KubeVersion)), APIVersions: q.ApplicationSource.GetAPIVersionsOrDefault(q.ApiVersions), @@ -2099,7 +2099,7 @@ func populateHelmAppDetails(res *apiclient.RepoAppDetailsResponse, appPath strin if err != nil { return err } - h, err := helm.NewHelmApp(appPath, helmRepos, false, version, q.Repo.Proxy, passCredentials) + h, err := helm.NewHelmApp(appPath, helmRepos, false, version, q.Repo.Proxy, q.Repo.NoProxy, passCredentials) if err != nil { return err } @@ -2180,7 +2180,7 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl if q.KustomizeOptions != nil { kustomizeBinary = q.KustomizeOptions.BinaryPath } - k := kustomize.NewKustomizeApp(repoRoot, appPath, q.Repo.GetGitCreds(credsStore), q.Repo.Repo, kustomizeBinary) + k := kustomize.NewKustomizeApp(repoRoot, appPath, q.Repo.GetGitCreds(credsStore), q.Repo.Repo, kustomizeBinary, q.Repo.Proxy, q.Repo.NoProxy) fakeManifestRequest := apiclient.ManifestRequest{ AppName: q.AppName, Namespace: "", // FIXME: omit it for now @@ -2341,7 +2341,7 @@ func (s *Service) GetRevisionChartDetails(ctx context.Context, q *apiclient.Repo return nil, fmt.Errorf("error extracting chart: %w", err) } defer io.Close(closer) - helmCmd, err := helm.NewCmdWithVersion(chartPath, q.Repo.EnableOCI, q.Repo.Proxy) + helmCmd, err := helm.NewCmdWithVersion(chartPath, q.Repo.EnableOCI, q.Repo.Proxy, q.Repo.NoProxy) if err != nil { return nil, fmt.Errorf("error creating helm cmd: %w", err) } @@ -2375,7 +2375,7 @@ func (s *Service) newClient(repo *v1alpha1.Repository, opts ...git.ClientOpts) ( return nil, err } opts = append(opts, git.WithEventHandlers(metrics.NewGitClientEventHandlers(s.metricsServer))) - return s.newGitClient(repo.Repo, repoPath, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.EnableLFS, repo.Proxy, opts...) + return s.newGitClient(repo.Repo, repoPath, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.EnableLFS, repo.Proxy, repo.NoProxy, opts...) } // newClientResolveRevision is a helper to perform the common task of instantiating a git client @@ -2395,7 +2395,7 @@ func (s *Service) newClientResolveRevision(repo *v1alpha1.Repository, revision s func (s *Service) newHelmClientResolveRevision(repo *v1alpha1.Repository, revision string, chart string, noRevisionCache bool) (helm.Client, string, error) { enableOCI := repo.EnableOCI || helm.IsHelmOciRepo(repo.Repo) - helmClient := s.newHelmClient(repo.Repo, repo.GetHelmCreds(), enableOCI, repo.Proxy, helm.WithIndexCache(s.cache), helm.WithChartPaths(s.chartPaths)) + helmClient := s.newHelmClient(repo.Repo, repo.GetHelmCreds(), enableOCI, repo.Proxy, repo.NoProxy, helm.WithIndexCache(s.cache), helm.WithChartPaths(s.chartPaths)) if helm.IsVersion(revision) { return helmClient, revision, nil } @@ -2508,7 +2508,7 @@ func checkoutRevision(gitClient git.Client, revision string, submoduleEnabled bo } func (s *Service) GetHelmCharts(ctx context.Context, q *apiclient.HelmChartsRequest) (*apiclient.HelmChartsResponse, error) { - index, err := s.newHelmClient(q.Repo.Repo, q.Repo.GetHelmCreds(), q.Repo.EnableOCI, q.Repo.Proxy, helm.WithChartPaths(s.chartPaths)).GetIndex(true, s.initConstants.HelmRegistryMaxIndexSize) + index, err := s.newHelmClient(q.Repo.Repo, q.Repo.GetHelmCreds(), q.Repo.EnableOCI, q.Repo.Proxy, q.Repo.NoProxy, helm.WithIndexCache(s.cache), helm.WithChartPaths(s.chartPaths)).GetIndex(true, s.initConstants.HelmRegistryMaxIndexSize) if err != nil { return nil, err } @@ -2533,17 +2533,17 @@ func (s *Service) TestRepository(ctx context.Context, q *apiclient.TestRepositor } checks := map[string]func() error{ "git": func() error { - return git.TestRepo(repo.Repo, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy) + return git.TestRepo(repo.Repo, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy, repo.NoProxy) }, "helm": func() error { if repo.EnableOCI { if !helm.IsHelmOciRepo(repo.Repo) { return errors.New("OCI Helm repository URL should include hostname and port only") } - _, err := helm.NewClient(repo.Repo, repo.GetHelmCreds(), repo.EnableOCI, repo.Proxy).TestHelmOCI() + _, err := helm.NewClient(repo.Repo, repo.GetHelmCreds(), repo.EnableOCI, repo.Proxy, repo.NoProxy).TestHelmOCI() return err } else { - _, err := helm.NewClient(repo.Repo, repo.GetHelmCreds(), repo.EnableOCI, repo.Proxy).GetIndex(false, s.initConstants.HelmRegistryMaxIndexSize) + _, err := helm.NewClient(repo.Repo, repo.GetHelmCreds(), repo.EnableOCI, repo.Proxy, repo.NoProxy).GetIndex(false, s.initConstants.HelmRegistryMaxIndexSize) return err } }, @@ -2574,7 +2574,7 @@ func (s *Service) ResolveRevision(ctx context.Context, q *apiclient.ResolveRevis AmbiguousRevision: fmt.Sprintf("%v (%v)", ambiguousRevision, revision), }, nil } else { - gitClient, err := git.NewClient(repo.Repo, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy) + gitClient, err := git.NewClient(repo.Repo, repo.GetGitCreds(s.gitCredsStore), repo.IsInsecure(), repo.IsLFSEnabled(), repo.Proxy, repo.NoProxy) if err != nil { return &apiclient.ResolveRevisionResponse{Revision: "", AmbiguousRevision: ""}, err } diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index bb4703bece5a4a..5488e654474a3d 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -148,10 +148,10 @@ func newServiceWithOpt(t *testing.T, cf clientFunc, root string) (*Service, *git t.Cleanup(cacheMocks.mockCache.StopRedisCallback) service := NewService(metrics.NewMetricsServer(), cacheMocks.cache, RepoServerInitConstants{ParallelismLimit: 1}, argo.NewResourceTracking(), &git.NoopCredsStore{}, root) - service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (client git.Client, e error) { + service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...git.ClientOpts) (client git.Client, e error) { return gitClient, nil } - service.newHelmClient = func(repoURL string, creds helm.Creds, enableOci bool, proxy string, opts ...helm.ClientOpts) helm.Client { + service.newHelmClient = func(repoURL string, creds helm.Creds, enableOci bool, proxy string, noProxy string, opts ...helm.ClientOpts) helm.Client { return helmClient } service.gitRepoInitializer = func(rootPath string) goio.Closer { @@ -191,7 +191,7 @@ func newServiceWithCommitSHA(t *testing.T, root, revision string) *Service { paths.On("GetPathIfExists", mock.Anything).Return(root, nil) }, root) - service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (client git.Client, e error) { + service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...git.ClientOpts) (client git.Client, e error) { return gitClient, nil } @@ -363,7 +363,7 @@ func TestGenerateManifest_RefOnlyShortCircuit(t *testing.T) { cacheMocks := newCacheMocks() t.Cleanup(cacheMocks.mockCache.StopRedisCallback) service := NewService(metrics.NewMetricsServer(), cacheMocks.cache, RepoServerInitConstants{ParallelismLimit: 1}, argo.NewResourceTracking(), &git.NoopCredsStore{}, repopath) - service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (client git.Client, e error) { + service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...git.ClientOpts) (client git.Client, e error) { opts = append(opts, git.WithEventHandlers(git.EventHandlers{ // Primary check, we want to make sure ls-remote is not called when the item is in cache OnLsRemote: func(repo string) func() { @@ -377,7 +377,7 @@ func TestGenerateManifest_RefOnlyShortCircuit(t *testing.T) { } }, })) - gitClient, err := git.NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, opts...) + gitClient, err := git.NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, noProxy, opts...) return gitClient, err } revision := initGitRepo(t, newGitRepoOptions{ @@ -431,7 +431,7 @@ func TestGenerateManifestsHelmWithRefs_CachedNoLsRemote(t *testing.T) { service := NewService(metrics.NewMetricsServer(), cacheMocks.cache, RepoServerInitConstants{ParallelismLimit: 1}, argo.NewResourceTracking(), &git.NoopCredsStore{}, repopath) var gitClient git.Client var err error - service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, opts ...git.ClientOpts) (client git.Client, e error) { + service.newGitClient = func(rawRepoURL string, root string, creds git.Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...git.ClientOpts) (client git.Client, e error) { opts = append(opts, git.WithEventHandlers(git.EventHandlers{ // Primary check, we want to make sure ls-remote is not called when the item is in cache OnLsRemote: func(repo string) func() { @@ -440,7 +440,7 @@ func TestGenerateManifestsHelmWithRefs_CachedNoLsRemote(t *testing.T) { } }, })) - gitClient, err = git.NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, opts...) + gitClient, err = git.NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, noProxy, opts...) return gitClient, err } repoRemote := fmt.Sprintf("file://%s", repopath) @@ -3036,7 +3036,7 @@ func TestCheckoutRevisionCanGetNonstandardRefs(t *testing.T) { destRepoPath, err := os.MkdirTemp(rootPath, "") require.NoError(t, err) - gitClient, err := git.NewClientExt("file://"+sourceRepoPath, destRepoPath, &git.NopCreds{}, true, false, "") + gitClient, err := git.NewClientExt("file://"+sourceRepoPath, destRepoPath, &git.NopCreds{}, true, false, "", "") require.NoError(t, err) pullSha, err := gitClient.LsRemote("refs/pull/123/head") @@ -3899,7 +3899,7 @@ func TestGetRefs_CacheWithLockDisabled(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) + client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() require.NoError(t, err) @@ -3926,7 +3926,7 @@ func TestGetRefs_CacheDisabled(t *testing.T) { }) cacheMocks := newCacheMocks() t.Cleanup(cacheMocks.mockCache.StopRedisCallback) - client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, false)) + client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", "", git.WithCache(cacheMocks.cache, false)) require.NoError(t, err) refs, err := client.LsRefs() require.NoError(t, err) @@ -3955,7 +3955,7 @@ func TestGetRefs_CacheWithLock(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) + client, err := git.NewClient(fmt.Sprintf("file://%s", dir), git.NopCreds{}, true, false, "", "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() require.NoError(t, err) @@ -3984,7 +3984,7 @@ func TestGetRefs_CacheUnlockedOnUpdateFailed(t *testing.T) { cacheMocks := newCacheMocks() t.Cleanup(cacheMocks.mockCache.StopRedisCallback) repoUrl := fmt.Sprintf("file://%s", dir) - client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) + client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() require.NoError(t, err) @@ -4015,7 +4015,7 @@ func TestGetRefs_CacheLockTryLockGitRefCacheError(t *testing.T) { repoUrl := fmt.Sprintf("file://%s", dir) // buf := bytes.Buffer{} // log.SetOutput(&buf) - client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", git.WithCache(cacheMocks.cache, true)) + client, err := git.NewClient(repoUrl, git.NopCreds{}, true, false, "", "", git.WithCache(cacheMocks.cache, true)) require.NoError(t, err) refs, err := client.LsRefs() require.NoError(t, err) diff --git a/server/repository/repository.go b/server/repository/repository.go index a4ebea5bad5fff..5502ab414a88e3 100644 --- a/server/repository/repository.go +++ b/server/repository/repository.go @@ -196,6 +196,7 @@ func (s *Server) ListRepositories(ctx context.Context, q *repositorypkg.RepoQuer EnableLFS: repo.EnableLFS, EnableOCI: repo.EnableOCI, Proxy: repo.Proxy, + NoProxy: repo.NoProxy, Project: repo.Project, ForceHttpBasicAuth: repo.ForceHttpBasicAuth, InheritedCreds: repo.InheritedCreds, diff --git a/ui/src/app/applications/components/application-fullscreen-logs/application-fullscreen-logs.scss b/ui/src/app/applications/components/application-fullscreen-logs/application-fullscreen-logs.scss index c735215f0cae89..80b2312a7b3d3d 100644 --- a/ui/src/app/applications/components/application-fullscreen-logs/application-fullscreen-logs.scss +++ b/ui/src/app/applications/components/application-fullscreen-logs/application-fullscreen-logs.scss @@ -10,4 +10,9 @@ height: 100%; padding: 20px 30px; background-color: $argo-color-gray-3; -} + + .theme-dark & { + background-color: #28292a; + color: #fff; + } +} \ No newline at end of file diff --git a/ui/src/app/applications/components/filter/filter.tsx b/ui/src/app/applications/components/filter/filter.tsx index 7c1bb1e81ec450..c0ef2268170c87 100644 --- a/ui/src/app/applications/components/filter/filter.tsx +++ b/ui/src/app/applications/components/filter/filter.tsx @@ -148,7 +148,7 @@ export const Filter = (props: FilterProps) => { setValues(update); }} style={{width: '100%'}} - inputStyle={{marginBottom: '0.5em', backgroundColor: 'black', border: 'none'}} + inputStyle={{marginBottom: '0.5em', backgroundColor: 'black', border: 'none', color: '#fff'}} /> )} {((props.field ? tags : options) || []).map((opt, i) => ( diff --git a/ui/src/app/settings/components/repo-details/repo-details.tsx b/ui/src/app/settings/components/repo-details/repo-details.tsx index 25fa9831727004..017d87bede789a 100644 --- a/ui/src/app/settings/components/repo-details/repo-details.tsx +++ b/ui/src/app/settings/components/repo-details/repo-details.tsx @@ -50,6 +50,13 @@ export const RepoDetails = (props: {repo: models.Repository; save?: (params: New }); } + if (repository.noProxy) { + items.push({ + title: 'NoProxy (optional)', + view: repository.noProxy + }); + } + return items; }; @@ -64,6 +71,7 @@ export const RepoDetails = (props: {repo: models.Repository; save?: (params: New insecure: repo.insecure || false, enableLfs: repo.enableLfs || false, proxy: repo.proxy || '', + noProxy: repo.noProxy || '', project: repo.project || '', enableOCI: repo.enableOCI || false, forceHttpBasicAuth: repo.forceHttpBasicAuth || false diff --git a/ui/src/app/settings/components/repos-list/repos-list.tsx b/ui/src/app/settings/components/repos-list/repos-list.tsx index 25db28e5ca6e74..2663bd63467cab 100644 --- a/ui/src/app/settings/components/repos-list/repos-list.tsx +++ b/ui/src/app/settings/components/repos-list/repos-list.tsx @@ -21,6 +21,7 @@ interface NewSSHRepoParams { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; } @@ -35,6 +36,7 @@ export interface NewHTTPSRepoParams { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; forceHttpBasicAuth?: boolean; enableOCI: boolean; @@ -53,6 +55,7 @@ interface NewGitHubAppRepoParams { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; } @@ -62,6 +65,7 @@ interface NewGoogleCloudSourceRepoParams { url: string; gcpServiceAccountKey: string; proxy: string; + noProxy: string; project?: string; } @@ -77,6 +81,7 @@ interface NewHTTPSRepoCredsParams { tlsClientCertData: string; tlsClientCertKey: string; proxy: string; + noProxy: string; forceHttpBasicAuth: boolean; enableOCI: boolean; } @@ -90,6 +95,7 @@ interface NewGitHubAppRepoCredsParams { tlsClientCertData: string; tlsClientCertKey: string; proxy: string; + noProxy: string; } interface NewGoogleCloudSourceRepoCredsParams { @@ -453,6 +459,9 @@ export class ReposList extends React.Component<
+
+ +
)} {this.state.method === ConnectionMethod.HTTPS && ( @@ -514,6 +523,9 @@ export class ReposList extends React.Component<
+
+ +
@@ -595,6 +607,9 @@ export class ReposList extends React.Component<
+
+ +
)} {this.state.method === ConnectionMethod.GOOGLECLOUD && ( @@ -618,6 +633,9 @@ export class ReposList extends React.Component<
+
+ +
)} @@ -709,6 +727,7 @@ export class ReposList extends React.Component< tlsClientCertData: params.tlsClientCertData, tlsClientCertKey: params.tlsClientCertKey, proxy: params.proxy, + noProxy: params.noProxy, forceHttpBasicAuth: params.forceHttpBasicAuth, enableOCI: params.enableOCI }); @@ -757,7 +776,8 @@ export class ReposList extends React.Component< githubAppEnterpriseBaseURL: params.githubAppEnterpriseBaseURL, tlsClientCertData: params.tlsClientCertData, tlsClientCertKey: params.tlsClientCertKey, - proxy: params.proxy + proxy: params.proxy, + noProxy: params.noProxy }); } else { this.setState({connecting: true}); diff --git a/ui/src/app/shared/models.ts b/ui/src/app/shared/models.ts index b8bd07b0321d85..0074c3791e64cd 100644 --- a/ui/src/app/shared/models.ts +++ b/ui/src/app/shared/models.ts @@ -535,6 +535,7 @@ export interface Repository { tlsClientCertData?: string; tlsClientCertKey?: string; proxy?: string; + noProxy?: string; insecure?: boolean; enableLfs?: boolean; githubAppId?: string; diff --git a/ui/src/app/shared/services/repo-service.ts b/ui/src/app/shared/services/repo-service.ts index 7b2ca1d3c58dc0..1b16bad02fcfb7 100644 --- a/ui/src/app/shared/services/repo-service.ts +++ b/ui/src/app/shared/services/repo-service.ts @@ -27,6 +27,7 @@ export class RepositoriesService { insecure, enableLfs, proxy, + noProxy, project, forceHttpBasicAuth, enableOCI @@ -41,13 +42,14 @@ export class RepositoriesService { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; forceHttpBasicAuth?: boolean; enableOCI: boolean; }): Promise { return requests .post('/repositories') - .send({type, name, repo: url, username, password, tlsClientCertData, tlsClientCertKey, insecure, enableLfs, proxy, project, forceHttpBasicAuth, enableOCI}) + .send({type, name, repo: url, username, password, tlsClientCertData, tlsClientCertKey, insecure, enableLfs, proxy, noProxy, project, forceHttpBasicAuth, enableOCI}) .then(res => res.body as models.Repository); } @@ -62,6 +64,7 @@ export class RepositoriesService { insecure, enableLfs, proxy, + noProxy, project, forceHttpBasicAuth, enableOCI @@ -76,13 +79,14 @@ export class RepositoriesService { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; forceHttpBasicAuth?: boolean; enableOCI: boolean; }): Promise { return requests .put(`/repositories/${encodeURIComponent(url)}`) - .send({type, name, repo: url, username, password, tlsClientCertData, tlsClientCertKey, insecure, enableLfs, proxy, project, forceHttpBasicAuth, enableOCI}) + .send({type, name, repo: url, username, password, tlsClientCertData, tlsClientCertKey, insecure, enableLfs, proxy, noProxy, project, forceHttpBasicAuth, enableOCI}) .then(res => res.body as models.Repository); } @@ -94,6 +98,7 @@ export class RepositoriesService { insecure, enableLfs, proxy, + noProxy, project }: { type: string; @@ -103,11 +108,12 @@ export class RepositoriesService { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; }): Promise { return requests .post('/repositories') - .send({type, name, repo: url, sshPrivateKey, insecure, enableLfs, proxy, project}) + .send({type, name, repo: url, sshPrivateKey, insecure, enableLfs, proxy, noProxy, project}) .then(res => res.body as models.Repository); } @@ -124,6 +130,7 @@ export class RepositoriesService { insecure, enableLfs, proxy, + noProxy, project }: { type: string; @@ -138,6 +145,7 @@ export class RepositoriesService { insecure: boolean; enableLfs: boolean; proxy: string; + noProxy: string; project?: string; }): Promise { return requests @@ -155,6 +163,7 @@ export class RepositoriesService { insecure, enableLfs, proxy, + noProxy, project }) .then(res => res.body as models.Repository); @@ -166,6 +175,7 @@ export class RepositoriesService { url, gcpServiceAccountKey, proxy, + noProxy, project }: { type: string; @@ -173,6 +183,7 @@ export class RepositoriesService { url: string; gcpServiceAccountKey: string; proxy: string; + noProxy: string; project?: string; }): Promise { return requests @@ -183,6 +194,7 @@ export class RepositoriesService { repo: url, gcpServiceAccountKey, proxy, + noProxy, project }) .then(res => res.body as models.Repository); diff --git a/ui/src/app/shared/services/repocreds-service.ts b/ui/src/app/shared/services/repocreds-service.ts index 5a2f48de52efae..b9f5f871eb12b9 100644 --- a/ui/src/app/shared/services/repocreds-service.ts +++ b/ui/src/app/shared/services/repocreds-service.ts @@ -15,7 +15,8 @@ export class RepoCredsService { password, tlsClientCertData, tlsClientCertKey, - proxy + proxy, + noProxy }: { url: string; username: string; @@ -23,10 +24,11 @@ export class RepoCredsService { tlsClientCertData: string; tlsClientCertKey: string; proxy: string; + noProxy: string; }): Promise { return requests .post('/repocreds') - .send({url, username, password, tlsClientCertData, tlsClientCertKey, proxy}) + .send({url, username, password, tlsClientCertData, tlsClientCertKey, proxy, noProxy}) .then(res => res.body as models.RepoCreds); } @@ -45,7 +47,8 @@ export class RepoCredsService { githubAppEnterpriseBaseURL, tlsClientCertData, tlsClientCertKey, - proxy + proxy, + noProxy }: { url: string; githubAppPrivateKey: string; @@ -55,10 +58,11 @@ export class RepoCredsService { tlsClientCertData: string; tlsClientCertKey: string; proxy: string; + noProxy: string; }): Promise { return requests .post('/repocreds') - .send({url, githubAppPrivateKey, githubAppId, githubAppInstallationId, githubAppEnterpriseBaseURL, tlsClientCertData, tlsClientCertKey, proxy}) + .send({url, githubAppPrivateKey, githubAppId, githubAppInstallationId, githubAppEnterpriseBaseURL, tlsClientCertData, tlsClientCertKey, proxy, noProxy}) .then(res => res.body as models.RepoCreds); } diff --git a/util/argo/argo.go b/util/argo/argo.go index 37c7bbc1c07331..ccd03f8f2fa935 100644 --- a/util/argo/argo.go +++ b/util/argo/argo.go @@ -753,10 +753,11 @@ func verifyGenerateManifests( } req := apiclient.ManifestRequest{ Repo: &argoappv1.Repository{ - Repo: source.RepoURL, - Type: repoRes.Type, - Name: repoRes.Name, - Proxy: repoRes.Proxy, + Repo: source.RepoURL, + Type: repoRes.Type, + Name: repoRes.Name, + Proxy: repoRes.Proxy, + NoProxy: repoRes.NoProxy, }, Repos: helmRepos, Revision: source.TargetRevision, diff --git a/util/db/repository_secrets.go b/util/db/repository_secrets.go index cdd055fefb0cbc..8ffc406c2b6775 100644 --- a/util/db/repository_secrets.go +++ b/util/db/repository_secrets.go @@ -312,6 +312,7 @@ func secretToRepository(secret *corev1.Secret) (*appsv1.Repository, error) { GithubAppPrivateKey: string(secret.Data["githubAppPrivateKey"]), GitHubAppEnterpriseBaseURL: string(secret.Data["githubAppEnterpriseBaseUrl"]), Proxy: string(secret.Data["proxy"]), + NoProxy: string(secret.Data["noProxy"]), Project: string(secret.Data["project"]), GCPServiceAccountKey: string(secret.Data["gcpServiceAccountKey"]), } @@ -384,6 +385,7 @@ func repositoryToSecret(repository *appsv1.Repository, secret *corev1.Secret) { updateSecretBool(secret, "insecure", repository.Insecure) updateSecretBool(secret, "enableLfs", repository.EnableLFS) updateSecretString(secret, "proxy", repository.Proxy) + updateSecretString(secret, "noProxy", repository.NoProxy) updateSecretString(secret, "gcpServiceAccountKey", repository.GCPServiceAccountKey) updateSecretBool(secret, "forceHttpBasicAuth", repository.ForceHttpBasicAuth) addSecretMetadata(secret, common.LabelValueSecretTypeRepository) @@ -402,6 +404,7 @@ func (s *secretsRepositoryBackend) secretToRepoCred(secret *corev1.Secret) (*app GitHubAppEnterpriseBaseURL: string(secret.Data["githubAppEnterpriseBaseUrl"]), GCPServiceAccountKey: string(secret.Data["gcpServiceAccountKey"]), Proxy: string(secret.Data["proxy"]), + NoProxy: string(secret.Data["noProxy"]), } enableOCI, err := boolOrFalse(secret, "enableOCI") @@ -450,6 +453,7 @@ func repoCredsToSecret(repoCreds *appsv1.RepoCreds, secret *corev1.Secret) { updateSecretString(secret, "githubAppEnterpriseBaseUrl", repoCreds.GitHubAppEnterpriseBaseURL) updateSecretString(secret, "gcpServiceAccountKey", repoCreds.GCPServiceAccountKey) updateSecretString(secret, "proxy", repoCreds.Proxy) + updateSecretString(secret, "noProxy", repoCreds.NoProxy) updateSecretBool(secret, "forceHttpBasicAuth", repoCreds.ForceHttpBasicAuth) addSecretMetadata(secret, common.LabelValueSecretTypeRepoCreds) } diff --git a/util/db/repository_secrets_test.go b/util/db/repository_secrets_test.go index 770004fa35a97a..0a74a9806f5cbc 100644 --- a/util/db/repository_secrets_test.go +++ b/util/db/repository_secrets_test.go @@ -576,6 +576,15 @@ func TestSecretsRepositoryBackend_CreateRepoCreds(t *testing.T) { Proxy: "https://proxy.argoproj.io:3128", }, }, + { + name: "with_noProxy", + repoCreds: appsv1.RepoCreds{ + URL: "git@github.com:proxy", + Username: "anotherUsername", + Password: "anotherPassword", + NoProxy: ".example.com,127.0.0.1", + }, + }, } for _, testCase := range testCases { @@ -616,6 +625,7 @@ func TestSecretsRepositoryBackend_CreateRepoCreds(t *testing.T) { } assert.Equal(t, testCase.repoCreds.GitHubAppEnterpriseBaseURL, string(secret.Data["githubAppEnterpriseUrl"])) assert.Equal(t, testCase.repoCreds.Proxy, string(secret.Data["proxy"])) + assert.Equal(t, testCase.repoCreds.NoProxy, string(secret.Data["noProxy"])) }) } } @@ -647,6 +657,20 @@ func TestSecretsRepositoryBackend_GetRepoCreds(t *testing.T) { "password": []byte("someOtherPassword"), }, }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: testNamespace, + Name: "proxy-repo", + Labels: map[string]string{common.LabelKeySecretType: common.LabelValueSecretTypeRepoCreds}, + }, + Data: map[string][]byte{ + "url": []byte("git@gitlab.com"), + "username": []byte("someOtherUsername"), + "password": []byte("someOtherPassword"), + "proxy": []byte("https://proxy.argoproj.io:3128"), + "noProxy": []byte(".example.com,127.0.0.1"), + }, + }, } clientset := getClientset(map[string]string{}, repoCredSecrets...) @@ -669,6 +693,12 @@ func TestSecretsRepositoryBackend_GetRepoCreds(t *testing.T) { assert.Equal(t, "git@gitlab.com", repoCred.URL) assert.Equal(t, "someOtherUsername", repoCred.Username) assert.Equal(t, "someOtherPassword", repoCred.Password) + if repoCred.Proxy != "" { + assert.Equal(t, "https://proxy.argoproj.io:3128", repoCred.Proxy) + } + if repoCred.NoProxy != "" { + assert.Equal(t, ".example.com,127.0.0.1", repoCred.NoProxy) + } } func TestSecretsRepositoryBackend_ListRepoCreds(t *testing.T) { diff --git a/util/dex/config.go b/util/dex/config.go index 3c68b11a55e9d8..1b2f0fd02dfaeb 100644 --- a/util/dex/config.go +++ b/util/dex/config.go @@ -2,11 +2,14 @@ package dex import ( "fmt" + "os" "sigs.k8s.io/yaml" "github.com/argoproj/argo-cd/v2/common" "github.com/argoproj/argo-cd/v2/util/settings" + + log "github.com/sirupsen/logrus" ) func GenerateDexConfigYAML(argocdSettings *settings.ArgoCDSettings, disableTls bool) ([]byte, error) { @@ -38,6 +41,20 @@ func GenerateDexConfigYAML(argocdSettings *settings.ArgoCDSettings, disableTls b } } + if loggerCfg, found := dexCfg["logger"].(map[string]interface{}); found { + if _, found := loggerCfg["level"]; !found { + loggerCfg["level"] = slogLevelFromLogrus(os.Getenv(common.EnvLogLevel)) + } + if _, found := loggerCfg["format"]; !found { + loggerCfg["format"] = os.Getenv(common.EnvLogFormat) + } + } else { + dexCfg["logger"] = map[string]interface{}{ + "level": slogLevelFromLogrus(os.Getenv(common.EnvLogLevel)), + "format": os.Getenv(common.EnvLogFormat), + } + } + dexCfg["grpc"] = map[string]interface{}{ "addr": "0.0.0.0:5557", } @@ -130,3 +147,23 @@ func needsRedirectURI(connectorType string) bool { } return false } + +func slogLevelFromLogrus(level string) string { + logrusLevel, err := log.ParseLevel(level) + if err != nil { + return level + } + + switch logrusLevel { + case log.DebugLevel, log.TraceLevel: + return "DEBUG" + case log.InfoLevel: + return "INFO" + case log.WarnLevel: + return "WARN" + case log.ErrorLevel, log.FatalLevel, log.PanicLevel: + return "ERROR" + } + // return the logrus level and let slog parse it + return level +} diff --git a/util/dex/dex_test.go b/util/dex/dex_test.go index 8d54dc2a6120ea..c4413b626eea60 100644 --- a/util/dex/dex_test.go +++ b/util/dex/dex_test.go @@ -9,11 +9,13 @@ import ( "strings" "testing" + log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "sigs.k8s.io/yaml" - // "github.com/argoproj/argo-cd/common" + "github.com/argoproj/argo-cd/v2/common" + utillog "github.com/argoproj/argo-cd/v2/util/log" "github.com/argoproj/argo-cd/v2/util/settings" ) @@ -142,6 +144,33 @@ connectors: nameAttr: cn ` +var goodDexConfigWithLogger = ` +logger: + level: debug + other: value +connectors: +# GitHub example +- type: github + id: github + name: GitHub + config: + clientID: aabbccddeeff00112233 + clientSecret: $dex.github.clientSecret + orgs: + - name: your-github-org + +# GitHub enterprise example +- type: github + id: acme-github + name: Acme GitHub + config: + hostName: github.acme.example.com + clientID: abcdefghijklmnopqrst + clientSecret: $dex.acme.clientSecret + orgs: + - name: your-github-org +` + var goodSecrets = map[string]string{ "dex.github.clientSecret": "foobar", "dex.acme.clientSecret": "barfoo", @@ -272,6 +301,65 @@ func Test_GenerateDexConfig(t *testing.T) { } }) + t.Run("Logging level", func(t *testing.T) { + s := settings.ArgoCDSettings{ + URL: "http://localhost", + DexConfig: goodDexConfig, + } + t.Setenv(common.EnvLogLevel, log.WarnLevel.String()) + t.Setenv(common.EnvLogFormat, utillog.JsonFormat) + + config, err := GenerateDexConfigYAML(&s, false) + require.NoError(t, err) + assert.NotNil(t, config) + var dexCfg map[string]interface{} + err = yaml.Unmarshal(config, &dexCfg) + if err != nil { + panic(err.Error()) + } + loggerCfg, ok := dexCfg["logger"].(map[string]interface{}) + assert.True(t, ok) + + level, ok := loggerCfg["level"].(string) + assert.True(t, ok) + assert.Equal(t, "WARN", level) + + format, ok := loggerCfg["format"].(string) + assert.True(t, ok) + assert.Equal(t, "json", format) + }) + + t.Run("Logging level with config", func(t *testing.T) { + s := settings.ArgoCDSettings{ + URL: "http://localhost", + DexConfig: goodDexConfigWithLogger, + } + t.Setenv(common.EnvLogLevel, log.WarnLevel.String()) + t.Setenv(common.EnvLogFormat, utillog.JsonFormat) + + config, err := GenerateDexConfigYAML(&s, false) + require.NoError(t, err) + assert.NotNil(t, config) + var dexCfg map[string]interface{} + err = yaml.Unmarshal(config, &dexCfg) + if err != nil { + panic(err.Error()) + } + loggerCfg, ok := dexCfg["logger"].(map[string]interface{}) + assert.True(t, ok) + + level, ok := loggerCfg["level"].(string) + assert.True(t, ok) + assert.Equal(t, "debug", level) + + format, ok := loggerCfg["format"].(string) + assert.True(t, ok) + assert.Equal(t, "json", format) + + _, ok = loggerCfg["other"].(string) + assert.True(t, ok) + }) + t.Run("Redirect config", func(t *testing.T) { types := []string{"oidc", "saml", "microsoft", "linkedin", "gitlab", "github", "bitbucket-cloud", "openshift", "gitea", "google", "oauth"} for _, c := range types { diff --git a/util/git/client.go b/util/git/client.go index 1144f0a48082ac..30a6e4d2042675 100644 --- a/util/git/client.go +++ b/util/git/client.go @@ -107,6 +107,8 @@ type nativeGitClient struct { loadRefFromCache bool // HTTP/HTTPS proxy used to access repository proxy string + // list of targets that shouldn't use the proxy, applies only if the proxy is set + noProxy string } type runOpts struct { @@ -152,7 +154,7 @@ func WithEventHandlers(handlers EventHandlers) ClientOpts { } } -func NewClient(rawRepoURL string, creds Creds, insecure bool, enableLfs bool, proxy string, opts ...ClientOpts) (Client, error) { +func NewClient(rawRepoURL string, creds Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...ClientOpts) (Client, error) { r := regexp.MustCompile("(/|:)") normalizedGitURL := NormalizeGitURL(rawRepoURL) if normalizedGitURL == "" { @@ -162,10 +164,10 @@ func NewClient(rawRepoURL string, creds Creds, insecure bool, enableLfs bool, pr if root == os.TempDir() { return nil, fmt.Errorf("repository %q cannot be initialized, because its root would be system temp at %s", rawRepoURL, root) } - return NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, opts...) + return NewClientExt(rawRepoURL, root, creds, insecure, enableLfs, proxy, noProxy, opts...) } -func NewClientExt(rawRepoURL string, root string, creds Creds, insecure bool, enableLfs bool, proxy string, opts ...ClientOpts) (Client, error) { +func NewClientExt(rawRepoURL string, root string, creds Creds, insecure bool, enableLfs bool, proxy string, noProxy string, opts ...ClientOpts) (Client, error) { client := &nativeGitClient{ repoURL: rawRepoURL, root: root, @@ -173,6 +175,7 @@ func NewClientExt(rawRepoURL string, root string, creds Creds, insecure bool, en insecure: insecure, enableLfs: enableLfs, proxy: proxy, + noProxy: noProxy, } for i := range opts { opts[i](client) @@ -190,7 +193,7 @@ var gitClientTimeout = env.ParseDurationFromEnv("ARGOCD_GIT_REQUEST_TIMEOUT", 15 // a client with those certificates in the list of root CAs used to verify // the server's certificate. // - Otherwise (and on non-fatal errors), a default HTTP client is returned. -func GetRepoHTTPClient(repoURL string, insecure bool, creds Creds, proxyURL string) *http.Client { +func GetRepoHTTPClient(repoURL string, insecure bool, creds Creds, proxyURL string, noProxy string) *http.Client { // Default HTTP client customHTTPClient := &http.Client{ // 15 second timeout by default @@ -201,7 +204,7 @@ func GetRepoHTTPClient(repoURL string, insecure bool, creds Creds, proxyURL stri }, } - proxyFunc := proxy.GetCallback(proxyURL) + proxyFunc := proxy.GetCallback(proxyURL, noProxy) // Callback function to return any configured client certificate // We never return err, but an empty cert instead. @@ -548,7 +551,7 @@ func (m *nativeGitClient) getRefs() ([]*plumbing.Reference, error) { if err != nil { return nil, err } - res, err := listRemote(remote, &git.ListOptions{Auth: auth}, m.insecure, m.creds, m.proxy) + res, err := listRemote(remote, &git.ListOptions{Auth: auth}, m.insecure, m.creds, m.proxy, m.noProxy) if err == nil && m.gitRefCache != nil { if err := m.gitRefCache.SetGitReferences(m.repoURL, res); err != nil { log.Warnf("Failed to store git references to cache: %v", err) @@ -873,7 +876,7 @@ func (m *nativeGitClient) runCmdOutput(cmd *exec.Cmd, ropts runOpts) (string, er } } } - cmd.Env = proxy.UpsertEnv(cmd, m.proxy) + cmd.Env = proxy.UpsertEnv(cmd, m.proxy, m.noProxy) opts := executil.ExecRunOpts{ TimeoutBehavior: argoexec.TimeoutBehavior{ Signal: syscall.SIGTERM, diff --git a/util/git/client_test.go b/util/git/client_test.go index c5817fae340817..c2f8061a1c2f0e 100644 --- a/util/git/client_test.go +++ b/util/git/client_test.go @@ -39,7 +39,7 @@ func Test_nativeGitClient_Fetch(t *testing.T) { tempDir, err := _createEmptyGitRepo() require.NoError(t, err) - client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "") + client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() @@ -53,7 +53,7 @@ func Test_nativeGitClient_Fetch_Prune(t *testing.T) { tempDir, err := _createEmptyGitRepo() require.NoError(t, err) - client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "") + client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() @@ -76,7 +76,7 @@ func Test_nativeGitClient_Fetch_Prune(t *testing.T) { func Test_IsAnnotatedTag(t *testing.T) { tempDir := t.TempDir() - client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "") + client, err := NewClient(fmt.Sprintf("file://%s", tempDir), NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() @@ -121,7 +121,7 @@ func Test_IsAnnotatedTag(t *testing.T) { func Test_ChangedFiles(t *testing.T) { tempDir := t.TempDir() - client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "") + client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() @@ -209,7 +209,7 @@ func Test_nativeGitClient_Submodule(t *testing.T) { err = runCmd(tempDir, "git", "clone", foo) require.NoError(t, err) - client, err := NewClient(fmt.Sprintf("file://%s", foo), NopCreds{}, true, false, "") + client, err := NewClient(fmt.Sprintf("file://%s", foo), NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() @@ -257,7 +257,7 @@ func Test_nativeGitClient_Submodule(t *testing.T) { } func TestNewClient_invalidSSHURL(t *testing.T) { - client, err := NewClient("ssh://bitbucket.org:org/repo", NopCreds{}, false, false, "") + client, err := NewClient("ssh://bitbucket.org:org/repo", NopCreds{}, false, false, "", "") assert.Nil(t, client) assert.ErrorIs(t, err, ErrInvalidRepoURL) } @@ -265,7 +265,7 @@ func TestNewClient_invalidSSHURL(t *testing.T) { func Test_IsRevisionPresent(t *testing.T) { tempDir := t.TempDir() - client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "") + client, err := NewClientExt(fmt.Sprintf("file://%s", tempDir), tempDir, NopCreds{}, true, false, "", "") require.NoError(t, err) err = client.Init() diff --git a/util/git/creds.go b/util/git/creds.go index b8870e94bb4adc..5715925dcef9ec 100644 --- a/util/git/creds.go +++ b/util/git/creds.go @@ -119,13 +119,15 @@ type HTTPSCreds struct { clientCertKey string // HTTP/HTTPS proxy used to access repository proxy string + // list of targets that shouldn't use the proxy, applies only if the proxy is set + noProxy string // temporal credentials store store CredsStore // whether to force usage of basic auth forceBasicAuth bool } -func NewHTTPSCreds(username string, password string, clientCertData string, clientCertKey string, insecure bool, proxy string, store CredsStore, forceBasicAuth bool) GenericHTTPSCreds { +func NewHTTPSCreds(username string, password string, clientCertData string, clientCertKey string, insecure bool, proxy string, noProxy string, store CredsStore, forceBasicAuth bool) GenericHTTPSCreds { return HTTPSCreds{ username, password, @@ -133,6 +135,7 @@ func NewHTTPSCreds(username string, password string, clientCertData string, clie clientCertData, clientCertKey, proxy, + noProxy, store, forceBasicAuth, } @@ -235,10 +238,11 @@ type SSHCreds struct { insecure bool store CredsStore proxy string + noProxy string } -func NewSSHCreds(sshPrivateKey string, caPath string, insecureIgnoreHostKey bool, store CredsStore, proxy string) SSHCreds { - return SSHCreds{sshPrivateKey, caPath, insecureIgnoreHostKey, store, proxy} +func NewSSHCreds(sshPrivateKey string, caPath string, insecureIgnoreHostKey bool, store CredsStore, proxy string, noProxy string) SSHCreds { + return SSHCreds{sshPrivateKey, caPath, insecureIgnoreHostKey, store, proxy, noProxy} } type sshPrivateKeyFile string @@ -335,12 +339,13 @@ type GitHubAppCreds struct { clientCertKey string insecure bool proxy string + noProxy string store CredsStore } // NewGitHubAppCreds provide github app credentials -func NewGitHubAppCreds(appID int64, appInstallId int64, privateKey string, baseURL string, repoURL string, clientCertData string, clientCertKey string, insecure bool, proxy string, store CredsStore) GenericHTTPSCreds { - return GitHubAppCreds{appID: appID, appInstallId: appInstallId, privateKey: privateKey, baseURL: baseURL, repoURL: repoURL, clientCertData: clientCertData, clientCertKey: clientCertKey, insecure: insecure, proxy: proxy, store: store} +func NewGitHubAppCreds(appID int64, appInstallId int64, privateKey string, baseURL string, repoURL string, clientCertData string, clientCertKey string, insecure bool, proxy string, noProxy string, store CredsStore) GenericHTTPSCreds { + return GitHubAppCreds{appID: appID, appInstallId: appInstallId, privateKey: privateKey, baseURL: baseURL, repoURL: repoURL, clientCertData: clientCertData, clientCertKey: clientCertKey, insecure: insecure, proxy: proxy, noProxy: noProxy, store: store} } func (g GitHubAppCreds) Environ() (io.Closer, []string, error) { @@ -439,7 +444,7 @@ func (g GitHubAppCreds) getAccessToken() (string, error) { } // Create a new GitHub transport - c := GetRepoHTTPClient(baseUrl, g.insecure, g, g.proxy) + c := GetRepoHTTPClient(baseUrl, g.insecure, g, g.proxy, g.noProxy) itr, err := ghinstallation.New(c.Transport, g.appID, g.appInstallId, diff --git a/util/git/creds_test.go b/util/git/creds_test.go index de4c9b2a2a2583..865e2316e0790b 100644 --- a/util/git/creds_test.go +++ b/util/git/creds_test.go @@ -49,7 +49,7 @@ func (s *memoryCredsStore) Environ(id string) []string { func TestHTTPSCreds_Environ_no_cert_cleanup(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("", "", "", "", true, "", store, false) + creds := NewHTTPSCreds("", "", "", "", true, "", "", store, false) closer, _, err := creds.Environ() require.NoError(t, err) credsLenBefore := len(store.creds) @@ -58,7 +58,7 @@ func TestHTTPSCreds_Environ_no_cert_cleanup(t *testing.T) { } func TestHTTPSCreds_Environ_insecure_true(t *testing.T) { - creds := NewHTTPSCreds("", "", "", "", true, "", &NoopCredsStore{}, false) + creds := NewHTTPSCreds("", "", "", "", true, "", "", &NoopCredsStore{}, false) closer, env, err := creds.Environ() t.Cleanup(func() { io.Close(closer) @@ -75,7 +75,7 @@ func TestHTTPSCreds_Environ_insecure_true(t *testing.T) { } func TestHTTPSCreds_Environ_insecure_false(t *testing.T) { - creds := NewHTTPSCreds("", "", "", "", false, "", &NoopCredsStore{}, false) + creds := NewHTTPSCreds("", "", "", "", false, "", "", &NoopCredsStore{}, false) closer, env, err := creds.Environ() t.Cleanup(func() { io.Close(closer) @@ -94,7 +94,7 @@ func TestHTTPSCreds_Environ_insecure_false(t *testing.T) { func TestHTTPSCreds_Environ_forceBasicAuth(t *testing.T) { t.Run("Enabled and credentials set", func(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("username", "password", "", "", false, "", store, true) + creds := NewHTTPSCreds("username", "password", "", "", false, "", "", store, true) closer, env, err := creds.Environ() require.NoError(t, err) defer closer.Close() @@ -112,7 +112,7 @@ func TestHTTPSCreds_Environ_forceBasicAuth(t *testing.T) { }) t.Run("Enabled but credentials not set", func(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("", "", "", "", false, "", store, true) + creds := NewHTTPSCreds("", "", "", "", false, "", "", store, true) closer, env, err := creds.Environ() require.NoError(t, err) defer closer.Close() @@ -129,7 +129,7 @@ func TestHTTPSCreds_Environ_forceBasicAuth(t *testing.T) { }) t.Run("Disabled with credentials set", func(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("username", "password", "", "", false, "", store, false) + creds := NewHTTPSCreds("username", "password", "", "", false, "", "", store, false) closer, env, err := creds.Environ() require.NoError(t, err) defer closer.Close() @@ -147,7 +147,7 @@ func TestHTTPSCreds_Environ_forceBasicAuth(t *testing.T) { t.Run("Disabled with credentials not set", func(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("", "", "", "", false, "", store, false) + creds := NewHTTPSCreds("", "", "", "", false, "", "", store, false) closer, env, err := creds.Environ() require.NoError(t, err) defer closer.Close() @@ -166,7 +166,7 @@ func TestHTTPSCreds_Environ_forceBasicAuth(t *testing.T) { func TestHTTPSCreds_Environ_clientCert(t *testing.T) { store := &memoryCredsStore{creds: make(map[string]cred)} - creds := NewHTTPSCreds("", "", "clientCertData", "clientCertKey", false, "", store, false) + creds := NewHTTPSCreds("", "", "clientCertData", "clientCertKey", false, "", "", store, false) closer, env, err := creds.Environ() require.NoError(t, err) var cert, key string @@ -204,7 +204,7 @@ func Test_SSHCreds_Environ(t *testing.T) { caFile := path.Join(tempDir, "caFile") err := os.WriteFile(caFile, []byte(""), os.FileMode(0o600)) require.NoError(t, err) - creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "") + creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "", "") closer, env, err := creds.Environ() require.NoError(t, err) require.Len(t, env, 2) @@ -237,7 +237,7 @@ func Test_SSHCreds_Environ_WithProxy(t *testing.T) { caFile := path.Join(tempDir, "caFile") err := os.WriteFile(caFile, []byte(""), os.FileMode(0o600)) require.NoError(t, err) - creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "socks5://127.0.0.1:1080") + creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "socks5://127.0.0.1:1080", "") closer, env, err := creds.Environ() require.NoError(t, err) require.Len(t, env, 2) @@ -271,7 +271,7 @@ func Test_SSHCreds_Environ_WithProxyUserNamePassword(t *testing.T) { caFile := path.Join(tempDir, "caFile") err := os.WriteFile(caFile, []byte(""), os.FileMode(0o600)) require.NoError(t, err) - creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "socks5://user:password@127.0.0.1:1080") + creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, "socks5://user:password@127.0.0.1:1080", "") closer, env, err := creds.Environ() require.NoError(t, err) require.Len(t, env, 4) @@ -317,7 +317,7 @@ func Test_SSHCreds_Environ_TempFileCleanupOnInvalidProxyURL(t *testing.T) { caFile := path.Join(tempDir, "caFile") err := os.WriteFile(caFile, []byte(""), os.FileMode(0o600)) require.NoError(t, err) - creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, ":invalid-proxy-url") + creds := NewSSHCreds("sshPrivateKey", caFile, insecureIgnoreHostKey, &NoopCredsStore{}, ":invalid-proxy-url", "") filesInDevShmBeforeInvocation := countFilesInDevShm() diff --git a/util/git/git.go b/util/git/git.go index d5a8652f7ce90a..3a087aeb000966 100644 --- a/util/git/git.go +++ b/util/git/git.go @@ -83,8 +83,8 @@ func IsHTTPURL(url string) bool { } // TestRepo tests if a repo exists and is accessible with the given credentials -func TestRepo(repo string, creds Creds, insecure bool, enableLfs bool, proxy string) error { - clnt, err := NewClient(repo, creds, insecure, enableLfs, proxy) +func TestRepo(repo string, creds Creds, insecure bool, enableLfs bool, proxy string, noProxy string) error { + clnt, err := NewClient(repo, creds, insecure, enableLfs, proxy, noProxy) if err != nil { return err } diff --git a/util/git/git_test.go b/util/git/git_test.go index b471b4888b1efe..bfa2905e7f5189 100644 --- a/util/git/git_test.go +++ b/util/git/git_test.go @@ -135,8 +135,8 @@ func TestCustomHTTPClient(t *testing.T) { assert.NotEqual(t, "", string(keyData)) // Get HTTPSCreds with client cert creds specified, and insecure connection - creds := NewHTTPSCreds("test", "test", string(certData), string(keyData), false, "http://proxy:5000", &NoopCredsStore{}, false) - client := GetRepoHTTPClient("https://localhost:9443/foo/bar", false, creds, "http://proxy:5000") + creds := NewHTTPSCreds("test", "test", string(certData), string(keyData), false, "http://proxy:5000", "", &NoopCredsStore{}, false) + client := GetRepoHTTPClient("https://localhost:9443/foo/bar", false, creds, "http://proxy:5000", "") assert.NotNil(t, client) assert.NotNil(t, client.Transport) if client.Transport != nil { @@ -157,14 +157,15 @@ func TestCustomHTTPClient(t *testing.T) { } proxy, err := transport.Proxy(nil) require.NoError(t, err) + assert.NotNil(t, proxy) // nil would mean no proxy is used assert.Equal(t, "http://proxy:5000", proxy.String()) } t.Setenv("http_proxy", "http://proxy-from-env:7878") // Get HTTPSCreds without client cert creds, but insecure connection - creds = NewHTTPSCreds("test", "test", "", "", true, "", &NoopCredsStore{}, false) - client = GetRepoHTTPClient("https://localhost:9443/foo/bar", true, creds, "") + creds = NewHTTPSCreds("test", "test", "", "", true, "", "", &NoopCredsStore{}, false) + client = GetRepoHTTPClient("https://localhost:9443/foo/bar", true, creds, "", "") assert.NotNil(t, client) assert.NotNil(t, client.Transport) if client.Transport != nil { @@ -197,7 +198,7 @@ func TestCustomHTTPClient(t *testing.T) { err = os.WriteFile(filepath.Join(temppath, "127.0.0.1"), cert, 0o666) require.NoError(t, err) t.Setenv(common.EnvVarTLSDataPath, temppath) - client = GetRepoHTTPClient("https://127.0.0.1", false, creds, "") + client = GetRepoHTTPClient("https://127.0.0.1", false, creds, "", "") assert.NotNil(t, client) assert.NotNil(t, client.Transport) if client.Transport != nil { @@ -210,7 +211,7 @@ func TestCustomHTTPClient(t *testing.T) { } func TestLsRemote(t *testing.T) { - clnt, err := NewClientExt("https://github.com/argoproj/argo-cd.git", "/tmp", NopCreds{}, false, false, "") + clnt, err := NewClientExt("https://github.com/argoproj/argo-cd.git", "/tmp", NopCreds{}, false, false, "", "") require.NoError(t, err) testCases := []struct { @@ -311,7 +312,7 @@ func TestLFSClient(t *testing.T) { tempDir := t.TempDir() - client, err := NewClientExt("https://github.com/argoproj-labs/argocd-testrepo-lfs", tempDir, NopCreds{}, false, true, "") + client, err := NewClientExt("https://github.com/argoproj-labs/argocd-testrepo-lfs", tempDir, NopCreds{}, false, true, "", "") require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") @@ -350,7 +351,7 @@ func TestLFSClient(t *testing.T) { func TestVerifyCommitSignature(t *testing.T) { p := t.TempDir() - client, err := NewClientExt("https://github.com/argoproj/argo-cd.git", p, NopCreds{}, false, false, "") + client, err := NewClientExt("https://github.com/argoproj/argo-cd.git", p, NopCreds{}, false, false, "", "") require.NoError(t, err) err = client.Init() @@ -404,7 +405,7 @@ func TestNewFactory(t *testing.T) { dirName := t.TempDir() - client, err := NewClientExt(tt.args.url, dirName, NopCreds{}, tt.args.insecureIgnoreHostKey, false, "") + client, err := NewClientExt(tt.args.url, dirName, NopCreds{}, tt.args.insecureIgnoreHostKey, false, "", "") require.NoError(t, err) commitSHA, err := client.LsRemote("HEAD") require.NoError(t, err) @@ -441,7 +442,7 @@ func TestListRevisions(t *testing.T) { dir := t.TempDir() repoURL := "https://github.com/argoproj/argo-cd.git" - client, err := NewClientExt(repoURL, dir, NopCreds{}, false, false, "") + client, err := NewClientExt(repoURL, dir, NopCreds{}, false, false, "", "") require.NoError(t, err) lsResult, err := client.LsRefs() @@ -460,7 +461,7 @@ func TestLsFiles(t *testing.T) { tmpDir1 := t.TempDir() tmpDir2 := t.TempDir() - client, err := NewClientExt("", tmpDir1, NopCreds{}, false, false, "") + client, err := NewClientExt("", tmpDir1, NopCreds{}, false, false, "", "") require.NoError(t, err) err = runCmd(tmpDir1, "git", "init") diff --git a/util/git/workaround.go b/util/git/workaround.go index 47636125cf3491..49cdc56343a1dc 100644 --- a/util/git/workaround.go +++ b/util/git/workaround.go @@ -16,8 +16,8 @@ import ( // As workaround methods `newUploadPackSession`, `newClient` and `listRemote` were copied from https://github.com/src-d/go-git/blob/master/remote.go and modified to use // transport with InsecureSkipVerify flag is verification should be disabled. -func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, creds Creds, proxy string) (transport.UploadPackSession, error) { - c, ep, err := newClient(url, insecure, creds, proxy) +func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, creds Creds, proxy string, noProxy string) (transport.UploadPackSession, error) { + c, ep, err := newClient(url, insecure, creds, proxy, noProxy) if err != nil { return nil, err } @@ -25,7 +25,7 @@ func newUploadPackSession(url string, auth transport.AuthMethod, insecure bool, return c.NewUploadPackSession(ep, auth) } -func newClient(url string, insecure bool, creds Creds, proxy string) (transport.Transport, *transport.Endpoint, error) { +func newClient(url string, insecure bool, creds Creds, proxy string, noProxy string) (transport.Transport, *transport.Endpoint, error) { ep, err := transport.NewEndpoint(url) if err != nil { return nil, nil, err @@ -57,11 +57,11 @@ func newClient(url string, insecure bool, creds Creds, proxy string) (transport. return c, ep, nil } - return http.NewClient(GetRepoHTTPClient(url, insecure, creds, proxy)), ep, nil + return http.NewClient(GetRepoHTTPClient(url, insecure, creds, proxy, noProxy)), ep, nil } -func listRemote(r *git.Remote, o *git.ListOptions, insecure bool, creds Creds, proxy string) (rfs []*plumbing.Reference, err error) { - s, err := newUploadPackSession(r.Config().URLs[0], o.Auth, insecure, creds, proxy) +func listRemote(r *git.Remote, o *git.ListOptions, insecure bool, creds Creds, proxy string, noProxy string) (rfs []*plumbing.Reference, err error) { + s, err := newUploadPackSession(r.Config().URLs[0], o.Auth, insecure, creds, proxy, noProxy) if err != nil { return nil, err } diff --git a/util/helm/client.go b/util/helm/client.go index 9caa1b5e140f20..4d4de65c3695b0 100644 --- a/util/helm/client.go +++ b/util/helm/client.go @@ -75,17 +75,18 @@ func WithChartPaths(chartPaths argoio.TempPaths) ClientOpts { } } -func NewClient(repoURL string, creds Creds, enableOci bool, proxy string, opts ...ClientOpts) Client { - return NewClientWithLock(repoURL, creds, globalLock, enableOci, proxy, opts...) +func NewClient(repoURL string, creds Creds, enableOci bool, proxy string, noProxy string, opts ...ClientOpts) Client { + return NewClientWithLock(repoURL, creds, globalLock, enableOci, proxy, noProxy, opts...) } -func NewClientWithLock(repoURL string, creds Creds, repoLock sync.KeyLock, enableOci bool, proxy string, opts ...ClientOpts) Client { +func NewClientWithLock(repoURL string, creds Creds, repoLock sync.KeyLock, enableOci bool, proxy string, noProxy string, opts ...ClientOpts) Client { c := &nativeHelmChart{ repoURL: repoURL, creds: creds, repoLock: repoLock, enableOci: enableOci, proxy: proxy, + noProxy: noProxy, chartCachePaths: argoio.NewRandomizedTempPaths(os.TempDir()), } for i := range opts { @@ -104,6 +105,7 @@ type nativeHelmChart struct { enableOci bool indexCache indexCache proxy string + noProxy string } func fileExist(filePath string) (bool, error) { @@ -141,7 +143,7 @@ func untarChart(tempDir string, cachedChartPath string, manifestMaxExtractedSize func (c *nativeHelmChart) ExtractChart(chart string, version string, project string, passCredentials bool, manifestMaxExtractedSize int64, disableManifestMaxExtractedSize bool) (string, argoio.Closer, error) { // always use Helm V3 since we don't have chart content to determine correct Helm version - helmCmd, err := NewCmdWithVersion("", c.enableOci, c.proxy) + helmCmd, err := NewCmdWithVersion("", c.enableOci, c.proxy, c.noProxy) if err != nil { return "", nil, err } @@ -269,7 +271,7 @@ func (c *nativeHelmChart) TestHelmOCI() (bool, error) { } defer func() { _ = os.RemoveAll(tmpDir) }() - helmCmd, err := NewCmdWithVersion(tmpDir, c.enableOci, c.proxy) + helmCmd, err := NewCmdWithVersion(tmpDir, c.enableOci, c.proxy, c.noProxy) if err != nil { return false, err } @@ -312,7 +314,7 @@ func (c *nativeHelmChart) loadRepoIndex(maxIndexSize int64) ([]byte, error) { } tr := &http.Transport{ - Proxy: proxy.GetCallback(c.proxy), + Proxy: proxy.GetCallback(c.proxy, c.noProxy), TLSClientConfig: tlsConf, DisableKeepAlives: true, } @@ -425,7 +427,7 @@ func (c *nativeHelmChart) GetTags(chart string, noCache bool) (*TagsList, error) return nil, fmt.Errorf("failed setup tlsConfig: %w", err) } client := &http.Client{Transport: &http.Transport{ - Proxy: proxy.GetCallback(c.proxy), + Proxy: proxy.GetCallback(c.proxy, c.noProxy), TLSClientConfig: tlsConf, DisableKeepAlives: true, }} diff --git a/util/helm/client_test.go b/util/helm/client_test.go index 63e6e1805e47aa..f03bd15bf096d6 100644 --- a/util/helm/client_test.go +++ b/util/helm/client_test.go @@ -35,12 +35,12 @@ func (f *fakeIndexCache) GetHelmIndex(_ string, indexData *[]byte) error { func TestIndex(t *testing.T) { t.Run("Invalid", func(t *testing.T) { - client := NewClient("", Creds{}, false, "") + client := NewClient("", Creds{}, false, "", "") _, err := client.GetIndex(false, 10000) require.Error(t, err) }) t.Run("Stable", func(t *testing.T) { - client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") + client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", "") index, err := client.GetIndex(false, 10000) require.NoError(t, err) assert.NotNil(t, index) @@ -49,7 +49,7 @@ func TestIndex(t *testing.T) { client := NewClient("https://argoproj.github.io/argo-helm", Creds{ Username: "my-password", Password: "my-username", - }, false, "") + }, false, "", "") index, err := client.GetIndex(false, 10000) require.NoError(t, err) assert.NotNil(t, index) @@ -61,7 +61,7 @@ func TestIndex(t *testing.T) { err := yaml.NewEncoder(&data).Encode(fakeIndex) require.NoError(t, err) - client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", WithIndexCache(&fakeIndexCache{data: data.Bytes()})) + client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", "", WithIndexCache(&fakeIndexCache{data: data.Bytes()})) index, err := client.GetIndex(false, 10000) require.NoError(t, err) @@ -69,7 +69,7 @@ func TestIndex(t *testing.T) { }) t.Run("Limited", func(t *testing.T) { - client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") + client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", "") _, err := client.GetIndex(false, 100) assert.ErrorContains(t, err, "unexpected end of stream") @@ -77,7 +77,7 @@ func TestIndex(t *testing.T) { } func Test_nativeHelmChart_ExtractChart(t *testing.T) { - client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") + client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", "") path, closer, err := client.ExtractChart("argo-cd", "0.7.1", "", false, math.MaxInt64, true) require.NoError(t, err) defer io.Close(closer) @@ -87,13 +87,13 @@ func Test_nativeHelmChart_ExtractChart(t *testing.T) { } func Test_nativeHelmChart_ExtractChartWithLimiter(t *testing.T) { - client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "") + client := NewClient("https://argoproj.github.io/argo-helm", Creds{}, false, "", "") _, _, err := client.ExtractChart("argo-cd", "0.7.1", "", false, 100, false) require.Error(t, err, "error while iterating on tar reader: unexpected EOF") } func Test_nativeHelmChart_ExtractChart_insecure(t *testing.T) { - client := NewClient("https://argoproj.github.io/argo-helm", Creds{InsecureSkipVerify: true}, false, "") + client := NewClient("https://argoproj.github.io/argo-helm", Creds{InsecureSkipVerify: true}, false, "", "") path, closer, err := client.ExtractChart("argo-cd", "0.7.1", "", false, math.MaxInt64, true) require.NoError(t, err) defer io.Close(closer) @@ -190,7 +190,7 @@ func TestGetTagsFromUrl(t *testing.T) { } })) - client := NewClient(server.URL, Creds{InsecureSkipVerify: true}, true, "") + client := NewClient(server.URL, Creds{InsecureSkipVerify: true}, true, "", "") tags, err := client.GetTags("mychart", true) require.NoError(t, err) @@ -206,7 +206,7 @@ func TestGetTagsFromUrl(t *testing.T) { }) t.Run("should return an error not when oci is not enabled", func(t *testing.T) { - client := NewClient("example.com", Creds{}, false, "") + client := NewClient("example.com", Creds{}, false, "", "") _, err := client.GetTags("my-chart", true) assert.ErrorIs(t, OCINotEnabledErr, err) @@ -276,7 +276,7 @@ func TestGetTagsFromURLPrivateRepoAuthentication(t *testing.T) { InsecureSkipVerify: true, Username: "my-username", Password: "my-password", - }, true, "") + }, true, "", "") tags, err := client.GetTags("mychart", true) diff --git a/util/helm/cmd.go b/util/helm/cmd.go index 213401dc23d2d0..bddbf3f069aa29 100644 --- a/util/helm/cmd.go +++ b/util/helm/cmd.go @@ -26,23 +26,24 @@ type Cmd struct { IsLocal bool IsHelmOci bool proxy string + noProxy string } -func NewCmd(workDir string, version string, proxy string) (*Cmd, error) { +func NewCmd(workDir string, version string, proxy string, noProxy string) (*Cmd, error) { switch version { // If v3 is specified (or by default, if no value is specified) then use v3 case "", "v3": - return NewCmdWithVersion(workDir, false, proxy) + return NewCmdWithVersion(workDir, false, proxy, noProxy) } return nil, fmt.Errorf("helm chart version '%s' is not supported", version) } -func NewCmdWithVersion(workDir string, isHelmOci bool, proxy string) (*Cmd, error) { +func NewCmdWithVersion(workDir string, isHelmOci bool, proxy string, noProxy string) (*Cmd, error) { tmpDir, err := os.MkdirTemp("", "helm") if err != nil { return nil, err } - return &Cmd{WorkDir: workDir, helmHome: tmpDir, IsHelmOci: isHelmOci, proxy: proxy}, err + return &Cmd{WorkDir: workDir, helmHome: tmpDir, IsHelmOci: isHelmOci, proxy: proxy, noProxy: noProxy}, err } var redactor = func(text string) string { @@ -65,7 +66,7 @@ func (c Cmd) run(args ...string) (string, string, error) { cmd.Env = append(cmd.Env, "HELM_EXPERIMENTAL_OCI=1") } - cmd.Env = proxy.UpsertEnv(cmd, c.proxy) + cmd.Env = proxy.UpsertEnv(cmd, c.proxy, c.noProxy) out, err := executil.RunWithRedactor(cmd, redactor) fullCommand := executil.GetCommandArgsToLog(cmd) diff --git a/util/helm/cmd_test.go b/util/helm/cmd_test.go index 67b07db2dd4f42..8d472c75e25c96 100644 --- a/util/helm/cmd_test.go +++ b/util/helm/cmd_test.go @@ -15,7 +15,7 @@ func Test_cmd_redactor(t *testing.T) { } func TestCmd_template_kubeVersion(t *testing.T) { - cmd, err := NewCmdWithVersion(".", false, "") + cmd, err := NewCmdWithVersion(".", false, "", "") require.NoError(t, err) s, _, err := cmd.template("testdata/redis", &TemplateOpts{ KubeVersion: "1.14", @@ -25,7 +25,7 @@ func TestCmd_template_kubeVersion(t *testing.T) { } func TestCmd_template_noApiVersionsInError(t *testing.T) { - cmd, err := NewCmdWithVersion(".", false, "") + cmd, err := NewCmdWithVersion(".", false, "", "") require.NoError(t, err) _, _, err = cmd.template("testdata/chart-does-not-exist", &TemplateOpts{ KubeVersion: "1.14", @@ -37,13 +37,14 @@ func TestCmd_template_noApiVersionsInError(t *testing.T) { } func TestNewCmd_helmInvalidVersion(t *testing.T) { - _, err := NewCmd(".", "abcd", "") + _, err := NewCmd(".", "abcd", "", "") log.Println(err) assert.EqualError(t, err, "helm chart version 'abcd' is not supported") } func TestNewCmd_withProxy(t *testing.T) { - cmd, err := NewCmd(".", "", "https://proxy:8888") + cmd, err := NewCmd(".", "", "https://proxy:8888", ".argoproj.io") require.NoError(t, err) assert.Equal(t, "https://proxy:8888", cmd.proxy) + assert.Equal(t, ".argoproj.io", cmd.noProxy) } diff --git a/util/helm/helm.go b/util/helm/helm.go index 0e01157e60bf85..682528e0b5a65b 100644 --- a/util/helm/helm.go +++ b/util/helm/helm.go @@ -42,8 +42,8 @@ type Helm interface { } // NewHelmApp create a new wrapper to run commands on the `helm` command-line tool. -func NewHelmApp(workDir string, repos []HelmRepository, isLocal bool, version string, proxy string, passCredentials bool) (Helm, error) { - cmd, err := NewCmd(workDir, version, proxy) +func NewHelmApp(workDir string, repos []HelmRepository, isLocal bool, version string, proxy string, noProxy string, passCredentials bool) (Helm, error) { + cmd, err := NewCmd(workDir, version, proxy, noProxy) if err != nil { return nil, err } diff --git a/util/helm/helm_test.go b/util/helm/helm_test.go index bcd0efe8cb3ca1..8468b9f36624b7 100644 --- a/util/helm/helm_test.go +++ b/util/helm/helm_test.go @@ -25,7 +25,7 @@ func template(h Helm, opts *TemplateOpts) ([]*unstructured.Unstructured, error) } func TestHelmTemplateParams(t *testing.T) { - h, err := NewHelmApp("./testdata/minio", []HelmRepository{}, false, "", "", false) + h, err := NewHelmApp("./testdata/minio", []HelmRepository{}, false, "", "", "", false) require.NoError(t, err) opts := TemplateOpts{ Name: "test", @@ -57,7 +57,7 @@ func TestHelmTemplateValues(t *testing.T) { repoRoot := "./testdata/redis" repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) - h, err := NewHelmApp(repoRootAbs, []HelmRepository{}, false, "", "", false) + h, err := NewHelmApp(repoRootAbs, []HelmRepository{}, false, "", "", "", false) require.NoError(t, err) valuesPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-production.yaml", nil) require.NoError(t, err) @@ -83,7 +83,7 @@ func TestHelmGetParams(t *testing.T) { repoRoot := "./testdata/redis" repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) - h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) + h, err := NewHelmApp(repoRootAbs, nil, false, "", "", "", false) require.NoError(t, err) params, err := h.GetParameters(nil, repoRootAbs, repoRootAbs) require.NoError(t, err) @@ -96,7 +96,7 @@ func TestHelmGetParamsValueFiles(t *testing.T) { repoRoot := "./testdata/redis" repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) - h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) + h, err := NewHelmApp(repoRootAbs, nil, false, "", "", "", false) require.NoError(t, err) valuesPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-production.yaml", nil) require.NoError(t, err) @@ -111,7 +111,7 @@ func TestHelmGetParamsValueFilesThatExist(t *testing.T) { repoRoot := "./testdata/redis" repoRootAbs, err := filepath.Abs(repoRoot) require.NoError(t, err) - h, err := NewHelmApp(repoRootAbs, nil, false, "", "", false) + h, err := NewHelmApp(repoRootAbs, nil, false, "", "", "", false) require.NoError(t, err) valuesMissingPath, _, err := path.ResolveValueFilePathOrUrl(repoRootAbs, repoRootAbs, "values-missing.yaml", nil) require.NoError(t, err) @@ -125,7 +125,7 @@ func TestHelmGetParamsValueFilesThatExist(t *testing.T) { } func TestHelmTemplateReleaseNameOverwrite(t *testing.T) { - h, err := NewHelmApp("./testdata/redis", nil, false, "", "", false) + h, err := NewHelmApp("./testdata/redis", nil, false, "", "", "", false) require.NoError(t, err) objs, err := template(h, &TemplateOpts{Name: "my-release"}) @@ -143,7 +143,7 @@ func TestHelmTemplateReleaseNameOverwrite(t *testing.T) { } func TestHelmTemplateReleaseName(t *testing.T) { - h, err := NewHelmApp("./testdata/redis", nil, false, "", "", false) + h, err := NewHelmApp("./testdata/redis", nil, false, "", "", "", false) require.NoError(t, err) objs, err := template(h, &TemplateOpts{Name: "test"}) require.NoError(t, err) @@ -203,7 +203,7 @@ func Test_flatVals(t *testing.T) { } func TestAPIVersions(t *testing.T) { - h, err := NewHelmApp("./testdata/api-versions", nil, false, "", "", false) + h, err := NewHelmApp("./testdata/api-versions", nil, false, "", "", "", false) require.NoError(t, err) objs, err := template(h, &TemplateOpts{}) @@ -218,7 +218,7 @@ func TestAPIVersions(t *testing.T) { } func TestSkipCrds(t *testing.T) { - h, err := NewHelmApp("./testdata/crds", nil, false, "", "", false) + h, err := NewHelmApp("./testdata/crds", nil, false, "", "", "", false) require.NoError(t, err) objs, err := template(h, &TemplateOpts{SkipCrds: false}) diff --git a/util/kustomize/kustomize.go b/util/kustomize/kustomize.go index 5a31180d989dbc..3509f4689de96f 100644 --- a/util/kustomize/kustomize.go +++ b/util/kustomize/kustomize.go @@ -22,6 +22,7 @@ import ( certutil "github.com/argoproj/argo-cd/v2/util/cert" executil "github.com/argoproj/argo-cd/v2/util/exec" "github.com/argoproj/argo-cd/v2/util/git" + "github.com/argoproj/argo-cd/v2/util/proxy" ) // represents a Docker image in the format NAME[:TAG]. @@ -39,13 +40,15 @@ type Kustomize interface { } // NewKustomizeApp create a new wrapper to run commands on the `kustomize` command-line tool. -func NewKustomizeApp(repoRoot string, path string, creds git.Creds, fromRepo string, binaryPath string) Kustomize { +func NewKustomizeApp(repoRoot string, path string, creds git.Creds, fromRepo string, binaryPath string, proxy string, noProxy string) Kustomize { return &kustomize{ repoRoot: repoRoot, path: path, creds: creds, repo: fromRepo, binaryPath: binaryPath, + proxy: proxy, + noProxy: noProxy, } } @@ -60,6 +63,10 @@ type kustomize struct { repo string // optional kustomize binary path binaryPath string + // HTTP/HTTPS proxy used to access repository + proxy string + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + noProxy string } var _ Kustomize = &kustomize{} @@ -322,6 +329,7 @@ func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOp cmd = exec.Command(k.getBinaryPath(), "build", k.path) } cmd.Env = env + cmd.Env = proxy.UpsertEnv(cmd, k.proxy, k.noProxy) cmd.Dir = k.repoRoot commands = append(commands, executil.GetCommandArgsToLog(cmd)) out, err := executil.Run(cmd) diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index bd341fa3e2f9d9..558e67b70fcdf5 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -43,7 +43,7 @@ func TestKustomizeBuild(t *testing.T) { namePrefix := "namePrefix-" nameSuffix := "-nameSuffix" namespace := "custom-namespace" - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") env := &v1alpha1.Env{ &v1alpha1.EnvEntry{Name: "ARGOCD_APP_NAME", Value: "argo-cd-tests"}, } @@ -128,7 +128,7 @@ func TestKustomizeBuild(t *testing.T) { func TestFailKustomizeBuild(t *testing.T) { appPath, err := testDataDir(t, kustomization1) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Replicas: []v1alpha1.KustomizeReplica{ { @@ -231,7 +231,7 @@ func TestKustomizeBuildForceCommonLabels(t *testing.T) { for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) switch tc.ExpectErr { case true: @@ -323,7 +323,7 @@ func TestKustomizeBuildForceCommonAnnotations(t *testing.T) { for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) switch tc.ExpectErr { case true: @@ -390,7 +390,7 @@ func TestKustomizeLabelWithoutSelector(t *testing.T) { for _, tc := range testCases { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) switch tc.ExpectErr { @@ -420,7 +420,7 @@ func TestKustomizeCustomVersion(t *testing.T) { kustomizePath, err := testDataDir(t, kustomization4) require.NoError(t, err) envOutputFile := kustomizePath + "/env_output" - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", kustomizePath+"/kustomize.special") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", kustomizePath+"/kustomize.special", "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Version: "special", } @@ -442,7 +442,7 @@ func TestKustomizeCustomVersion(t *testing.T) { func TestKustomizeBuildComponents(t *testing.T) { appPath, err := testDataDir(t, kustomization6) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Components: []string{"./components"}, @@ -463,7 +463,7 @@ func TestKustomizeBuildComponents(t *testing.T) { func TestKustomizeBuildPatches(t *testing.T) { appPath, err := testDataDir(t, kustomization5) require.NoError(t, err) - kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "") + kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") kustomizeSource := v1alpha1.ApplicationSourceKustomize{ Patches: []v1alpha1.KustomizePatch{ diff --git a/util/proxy/proxy.go b/util/proxy/proxy.go index 3055e62130c3fb..bef4ce47b81dcc 100644 --- a/util/proxy/proxy.go +++ b/util/proxy/proxy.go @@ -6,10 +6,12 @@ import ( "net/url" "os/exec" "strings" + + "golang.org/x/net/http/httpproxy" ) // UpsertEnv removes the existing proxy env variables and adds the custom proxy variables -func UpsertEnv(cmd *exec.Cmd, proxy string) []string { +func UpsertEnv(cmd *exec.Cmd, proxy string, noProxy string) []string { envs := []string{} if proxy == "" { return cmd.Env @@ -17,19 +19,27 @@ func UpsertEnv(cmd *exec.Cmd, proxy string) []string { // remove the existing proxy env variable if present for i, env := range cmd.Env { proxyEnv := strings.ToLower(env) - if strings.HasPrefix(proxyEnv, "http_proxy") || strings.HasPrefix(proxyEnv, "https_proxy") { + if strings.HasPrefix(proxyEnv, "http_proxy") || strings.HasPrefix(proxyEnv, "https_proxy") || strings.HasPrefix(proxyEnv, "no_proxy") { continue } envs = append(envs, cmd.Env[i]) } - return append(envs, httpProxy(proxy), httpsProxy(proxy)) + return append(envs, httpProxy(proxy), httpsProxy(proxy), noProxyVar(noProxy)) } // GetCallback returns the proxy callback function -func GetCallback(proxy string) func(*http.Request) (*url.URL, error) { +func GetCallback(proxy string, noProxy string) func(*http.Request) (*url.URL, error) { if proxy != "" { + c := httpproxy.Config{ + HTTPProxy: proxy, + HTTPSProxy: proxy, + NoProxy: noProxy, + } return func(r *http.Request) (*url.URL, error) { - return url.Parse(proxy) + if r != nil { + return c.ProxyFunc()(r.URL) + } + return url.Parse(c.HTTPProxy) } } // read proxy from env variable if custom proxy is missing @@ -43,3 +53,7 @@ func httpProxy(url string) string { func httpsProxy(url string) string { return fmt.Sprintf("https_proxy=%s", url) } + +func noProxyVar(noProxy string) string { + return fmt.Sprintf("no_proxy=%s", noProxy) +} diff --git a/util/proxy/proxy_test.go b/util/proxy/proxy_test.go index 2224e611dad234..85e31685c90030 100644 --- a/util/proxy/proxy_test.go +++ b/util/proxy/proxy_test.go @@ -3,6 +3,7 @@ package proxy import ( "net/http" "net/http/httptest" + "net/url" "os/exec" "testing" @@ -13,31 +14,40 @@ import ( func TestAddProxyEnvIfAbsent(t *testing.T) { t.Run("Existing proxy env variables", func(t *testing.T) { proxy := "https://proxy:5000" + noProxy := ".argoproj.io" cmd := exec.Command("test") - cmd.Env = []string{`http_proxy="https_proxy=https://env-proxy:8888"`, "key=val"} - got := UpsertEnv(cmd, proxy) - assert.EqualValues(t, []string{"key=val", httpProxy(proxy), httpsProxy(proxy)}, got) + cmd.Env = []string{`http_proxy="https_proxy=https://env-proxy:8888"`, "key=val", "no_proxy=.argoproj.io"} + got := UpsertEnv(cmd, proxy, noProxy) + assert.EqualValues(t, []string{"key=val", httpProxy(proxy), httpsProxy(proxy), noProxyVar(noProxy)}, got) }) t.Run("proxy env variables not found", func(t *testing.T) { proxy := "http://proxy:5000" + noProxy := ".argoproj.io" cmd := exec.Command("test") cmd.Env = []string{"key=val"} - got := UpsertEnv(cmd, proxy) - assert.EqualValues(t, []string{"key=val", httpProxy(proxy), httpsProxy(proxy)}, got) + got := UpsertEnv(cmd, proxy, noProxy) + assert.EqualValues(t, []string{"key=val", httpProxy(proxy), httpsProxy(proxy), noProxyVar(noProxy)}, got) }) } func TestGetCallBack(t *testing.T) { t.Run("custom proxy present", func(t *testing.T) { proxy := "http://proxy:8888" - url, err := GetCallback(proxy)(nil) + url, err := GetCallback(proxy, "")(nil) require.NoError(t, err) assert.Equal(t, proxy, url.String()) }) + t.Run("custom proxy present, noProxy filteres request", func(t *testing.T) { + proxy := "http://proxy:8888" + noProxy := "argoproj.io" + url, err := GetCallback(proxy, noProxy)(&http.Request{URL: &url.URL{Host: "argoproj.io"}}) + require.NoError(t, err) + assert.Nil(t, url) // proxy object being nil indicates that no proxy should be used for this request + }) t.Run("custom proxy absent", func(t *testing.T) { proxyEnv := "http://proxy:8888" t.Setenv("http_proxy", "http://proxy:8888") - url, err := GetCallback("")(httptest.NewRequest(http.MethodGet, proxyEnv, nil)) + url, err := GetCallback("", "")(httptest.NewRequest(http.MethodGet, proxyEnv, nil)) require.NoError(t, err) assert.Equal(t, proxyEnv, url.String()) }) diff --git a/util/settings/settings.go b/util/settings/settings.go index 5b994534bb51c5..d3a2372e2cc18b 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -341,6 +341,8 @@ type Repository struct { GithubAppEnterpriseBaseURL string `json:"githubAppEnterpriseBaseUrl,omitempty"` // Proxy specifies the HTTP/HTTPS proxy used to access the repo Proxy string `json:"proxy,omitempty"` + // NoProxy specifies a list of targets where the proxy isn't used, applies only in cases where the proxy is applied + NoProxy string `json:"noProxy,omitempty"` // GCPServiceAccountKey specifies the service account key in JSON format to be used for getting credentials to Google Cloud Source repos GCPServiceAccountKey *apiv1.SecretKeySelector `json:"gcpServiceAccountKey,omitempty"` // ForceHttpBasicAuth determines whether Argo CD should force use of basic auth for HTTP connected repositories