diff --git a/main_test.go b/main_test.go index b71878f..a851ebe 100644 --- a/main_test.go +++ b/main_test.go @@ -226,7 +226,7 @@ func Test_runVerify(t *testing.T) { pversiontag: pString("v0"), err: pkg.ErrorMismatchVersionedTag, }, - // Provenance contains tag = v14.2. )2.5 + // Provenance contains tag = v14.2 { name: "versioned v14.2 match push-v14.2", artifact: "binary-linux-amd64-push-v14.2", diff --git a/pkg/provenance.go b/pkg/provenance.go index 3291391..3e0b923 100644 --- a/pkg/provenance.go +++ b/pkg/provenance.go @@ -625,6 +625,20 @@ func getAsString(environment map[string]interface{}, field string) (string, erro return i, nil } +func getEventPayload(environment map[string]interface{}) (map[string]interface{}, error) { + eventPayload, ok := environment["github_event_payload"] + if !ok { + return nil, fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "parameters type event payload") + } + + payload, ok := eventPayload.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "parameters type payload") + } + + return payload, nil +} + func getBaseRef(environment map[string]interface{}) (string, error) { baseRef, err := getAsString(environment, "github_base_ref") if err != nil { @@ -638,7 +652,7 @@ func getBaseRef(environment map[string]interface{}) (string, error) { // Look at the event payload instead. // We don't do that for all triggers because the payload - // is event-specific; and only the `push` event seems to have a `base_ref``. + // is event-specific; and only the `push` event seems to have a `base_ref`. eventName, err := getAsString(environment, "github_event_name") if err != nil { return "", err @@ -648,19 +662,59 @@ func getBaseRef(environment map[string]interface{}) (string, error) { return "", nil } - eventPayload, ok := environment["github_event_payload"] - if !ok { - return "", fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "parameters type event payload") - } - - payload, ok := eventPayload.(map[string]interface{}) - if !ok { - return "", fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "parameters type payload") + payload, err := getEventPayload(environment) + if err != nil { + return "", err } return getAsString(payload, "base_ref") } +func getTargetCommittish(environment map[string]interface{}) (string, error) { + eventName, err := getAsString(environment, "github_event_name") + if err != nil { + return "", err + } + + if eventName != "release" { + return "", nil + } + + payload, err := getEventPayload(environment) + if err != nil { + return "", err + } + + // For a release event, we look for release.target_commitish. + releasePayload, ok := payload["release"] + if !ok { + return "", fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "release absent from payload") + } + + release, ok := releasePayload.(map[string]interface{}) + if !ok { + return "", fmt.Errorf("%w: %s", ErrorInvalidDssePayload, "parameters type releasePayload") + } + + branch, err := getAsString(release, "target_commitish") + if err != nil { + return "", fmt.Errorf("%w: %s", err, "target_commitish not present") + } + + return "refs/heads/" + branch, nil +} + +func getBranchForTag(environment map[string]interface{}) (string, error) { + // First try the base_ref. + branch, err := getBaseRef(environment) + if branch != "" || err != nil { + return branch, err + } + + // Second try the target comittish. + return getTargetCommittish(environment) +} + // Get tag from the provenance invocation parameters. func getTag(env *dsselib.Envelope) (string, error) { pyld, err := base64.StdEncoding.DecodeString(env.Payload) @@ -720,7 +774,7 @@ func getBranch(env *dsselib.Envelope) (string, error) { case "branch": return getAsString(environment, "github_ref") case "tag": - return getBaseRef(environment) + return getBranchForTag(environment) default: return "", fmt.Errorf("%w: %s %s", ErrorInvalidDssePayload, "unknown ref type", refType) diff --git a/pkg/provenance_test.go b/pkg/provenance_test.go index 889a7df..5c38327 100644 --- a/pkg/provenance_test.go +++ b/pkg/provenance_test.go @@ -353,10 +353,15 @@ func Test_VerifyBranch(t *testing.T) { expected: ErrorInvalidDssePayload, }, { - name: "tag branch2", + name: "tag branch2 push trigger", path: "./testdata/dsse-branch2-tag.intoto.jsonl", branch: "branch2", }, + { + name: "v10.0.1 release trigger", + path: "./testdata/dsse-v10.0.1-release.intoto.jsonl", + branch: "main", + }, } for _, tt := range tests { tt := tt // Re-initializing variable so it is not changed while executing the closure below diff --git a/pkg/testdata/dsse-v10.0.1-release.intoto.jsonl b/pkg/testdata/dsse-v10.0.1-release.intoto.jsonl new file mode 100644 index 0000000..1cd0d85 --- /dev/null +++ b/pkg/testdata/dsse-v10.0.1-release.intoto.jsonl @@ -0,0 +1 @@ +{"payloadType":"application/vnd.in-toto+json","payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiJzY29yZWNhcmQtbGludXgtYW1kNjQiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDRkOTE2NmRiNmZmY2IwMzBlMGIyMDVmYzViNTk4Y2Q1NDc0MmY5MzgyNjVjNjYzYWUwYzFlODkzMmM2ZDVkZiJ9fV0sInByZWRpY2F0ZSI6eyJidWlsZGVyIjp7ImlkIjoiaHR0cHM6Ly9naXRodWIuY29tL3Nsc2EtZnJhbWV3b3JrL3Nsc2EtZ2l0aHViLWdlbmVyYXRvci8uZ2l0aHViL3dvcmtmbG93cy9idWlsZGVyX2dvX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjEuMC4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ29AdjEiLCJpbnZvY2F0aW9uIjp7ImNvbmZpZ1NvdXJjZSI6eyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weUByZWZzL3RhZ3MvdjEwLjAuMSIsImRpZ2VzdCI6eyJzaGExIjoiNmNkMjlkZDFjZjJjNzJmMDUzOWI1MDQwNWQ3NTMzODU1NTM2NjM1MSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3Mvc2xzYS1yZWxlYXNlci55bWwifSwicGFyYW1ldGVycyI6e30sImVudmlyb25tZW50Ijp7ImFyY2giOiJYNjQiLCJnaXRodWJfYWN0b3IiOiJsYXVyZW50c2ltb24iLCJnaXRodWJfYWN0b3JfaWQiOiI2NDUwNTA5OSIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoicmVsZWFzZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImFjdGlvbiI6ImNyZWF0ZWQiLCJyZWxlYXNlIjp7ImFzc2V0cyI6W10sImFzc2V0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9yZWxlYXNlcy82OTAwNjAyMy9hc3NldHMiLCJhdXRob3IiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS82NDUwNTA5OT92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZXZlbnRzey9wcml2YWN5fSIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2dpc3Rzey9naXN0X2lkfSIsImdyYXZhdGFyX2lkIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uIiwiaWQiOjY0NTA1MDk5LCJsb2dpbiI6ImxhdXJlbnRzaW1vbiIsIm5vZGVfaWQiOiJNRFE2VlhObGNqWTBOVEExTURrNSIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9yZXBvcyIsInNpdGVfYWRtaW4iOmZhbHNlLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiVXNlciIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uIn0sImJvZHkiOiJ2MTAuMC4xIGZvciByZWxlYXNlIGNyZWF0ZWQgdHJpZ2dlciIsImNyZWF0ZWRfYXQiOiIyMDIyLTA2LTA4VDIyOjQ4OjM3WiIsImRyYWZ0IjpmYWxzZSwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L3JlbGVhc2VzL3RhZy92MTAuMC4xIiwiaWQiOjY5MDA2MDIzLCJuYW1lIjoidjEwLjAuMSIsIm5vZGVfaWQiOiJSRV9rd0RPSGR5M0w4NEVIUExIIiwicHJlcmVsZWFzZSI6ZmFsc2UsInB1Ymxpc2hlZF9hdCI6IjIwMjItMDYtMDhUMjI6NDk6MTRaIiwidGFnX25hbWUiOiJ2MTAuMC4xIiwidGFyYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS90YXJiYWxsL3YxMC4wLjEiLCJ0YXJnZXRfY29tbWl0aXNoIjoibWFpbiIsInVwbG9hZF91cmwiOiJodHRwczovL3VwbG9hZHMuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvcmVsZWFzZXMvNjkwMDYwMjMvYXNzZXRzez9uYW1lLGxhYmVsfSIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L3JlbGVhc2VzLzY5MDA2MDIzIiwiemlwYmFsbF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS96aXBiYWxsL3YxMC4wLjEifSwicmVwb3NpdG9yeSI6eyJhbGxvd19mb3JraW5nIjp0cnVlLCJhcmNoaXZlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L3thcmNoaXZlX2Zvcm1hdH17L3JlZn0iLCJhcmNoaXZlZCI6ZmFsc2UsImFzc2lnbmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9hc3NpZ25lZXN7L3VzZXJ9IiwiYmxvYnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvZ2l0L2Jsb2Jzey9zaGF9IiwiYnJhbmNoZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvYnJhbmNoZXN7L2JyYW5jaH0iLCJjbG9uZV91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5LmdpdCIsImNvbGxhYm9yYXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvY29sbGFib3JhdG9yc3svY29sbGFib3JhdG9yfSIsImNvbW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2NvbW1lbnRzey9udW1iZXJ9IiwiY29tbWl0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9jb21taXRzey9zaGF9IiwiY29tcGFyZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9jb21wYXJlL3tiYXNlfS4uLntoZWFkfSIsImNvbnRlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2NvbnRlbnRzL3srcGF0aH0iLCJjb250cmlidXRvcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvY29udHJpYnV0b3JzIiwiY3JlYXRlZF9hdCI6IjIwMjItMDYtMDdUMjE6MDY6NTdaIiwiZGVmYXVsdF9icmFuY2giOiJtYWluIiwiZGVwbG95bWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvZGVwbG95bWVudHMiLCJkZXNjcmlwdGlvbiI6bnVsbCwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6MCwiZm9ya3NfY291bnQiOjAsImZvcmtzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2ZvcmtzIiwiZnVsbF9uYW1lIjoibGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5IiwiZ2l0X2NvbW1pdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvZ2l0L2NvbW1pdHN7L3NoYX0iLCJnaXRfcmVmc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9naXQvcmVmc3svc2hhfSIsImdpdF90YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2dpdC90YWdzey9zaGF9IiwiZ2l0X3VybCI6ImdpdDovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5LmdpdCIsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOnRydWUsImhvbWVwYWdlIjpudWxsLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9ob29rcyIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weSIsImlkIjo1MDEwMDQwNzksImlzX3RlbXBsYXRlIjpmYWxzZSwiaXNzdWVfY29tbWVudF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9pc3N1ZXMvY29tbWVudHN7L251bWJlcn0iLCJpc3N1ZV9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvaXNzdWVzL2V2ZW50c3svbnVtYmVyfSIsImlzc3Vlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9pc3N1ZXN7L251bWJlcn0iLCJrZXlzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2tleXN7L2tleV9pZH0iLCJsYWJlbHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvbGFiZWxzey9uYW1lfSIsImxhbmd1YWdlIjoiR28iLCJsYW5ndWFnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvbGFuZ3VhZ2VzIiwibGljZW5zZSI6eyJrZXkiOiJhcGFjaGUtMi4wIiwibmFtZSI6IkFwYWNoZSBMaWNlbnNlIDIuMCIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVEk9Iiwic3BkeF9pZCI6IkFwYWNoZS0yLjAiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL2xpY2Vuc2VzL2FwYWNoZS0yLjAifSwibWVyZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L21lcmdlcyIsIm1pbGVzdG9uZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvbWlsZXN0b25lc3svbnVtYmVyfSIsIm1pcnJvcl91cmwiOm51bGwsIm5hbWUiOiJzY29yZWNhcmQtY29weSIsIm5vZGVfaWQiOiJSX2tnRE9IZHkzTHciLCJub3RpZmljYXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L25vdGlmaWNhdGlvbnN7P3NpbmNlLGFsbCxwYXJ0aWNpcGF0aW5nfSIsIm9wZW5faXNzdWVzIjowLCJvcGVuX2lzc3Vlc19jb3VudCI6MCwib3duZXIiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS82NDUwNTA5OT92PTQiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZXZlbnRzey9wcml2YWN5fSIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2dpc3Rzey9naXN0X2lkfSIsImdyYXZhdGFyX2lkIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbGF1cmVudHNpbW9uIiwiaWQiOjY0NTA1MDk5LCJsb2dpbiI6ImxhdXJlbnRzaW1vbiIsIm5vZGVfaWQiOiJNRFE2VlhObGNqWTBOVEExTURrNSIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9yZXBvcyIsInNpdGVfYWRtaW4iOmZhbHNlLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiVXNlciIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uIn0sInByaXZhdGUiOmZhbHNlLCJwdWxsc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS9wdWxsc3svbnVtYmVyfSIsInB1c2hlZF9hdCI6IjIwMjItMDYtMDhUMjI6NDk6MTRaIiwicmVsZWFzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvcmVsZWFzZXN7L2lkfSIsInNpemUiOjM1NjExLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206bGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5LmdpdCIsInN0YXJnYXplcnNfY291bnQiOjAsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkvc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHkiLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2xhdXJlbnRzaW1vbi9zY29yZWNhcmQtY29weS90ZWFtcyIsInRvcGljcyI6W10sInRyZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5L2dpdC90cmVlc3svc2hhfSIsInVwZGF0ZWRfYXQiOiIyMDIyLTA2LTA3VDIxOjI1OjI5WiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvbGF1cmVudHNpbW9uL3Njb3JlY2FyZC1jb3B5IiwidmlzaWJpbGl0eSI6InB1YmxpYyIsIndhdGNoZXJzIjowLCJ3YXRjaGVyc19jb3VudCI6MH0sInNlbmRlciI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY0NTA1MDk5P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9ldmVudHN7L3ByaXZhY3l9IiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vZ2lzdHN7L2dpc3RfaWR9IiwiZ3JhdmF0YXJfaWQiOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9sYXVyZW50c2ltb24iLCJpZCI6NjQ1MDUwOTksImxvZ2luIjoibGF1cmVudHNpbW9uIiwibm9kZV9pZCI6Ik1EUTZWWE5sY2pZME5UQTFNRGs1Iiwib3JnYW5pemF0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xhdXJlbnRzaW1vbi9vcmdzIiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGF1cmVudHNpbW9uL3JlcG9zIiwic2l0ZV9hZG1pbiI6ZmFsc2UsInN0YXJyZWRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24vc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJVc2VyIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sYXVyZW50c2ltb24ifX0sImdpdGh1Yl9oZWFkX3JlZiI6IiIsImdpdGh1Yl9yZWYiOiJyZWZzL3RhZ3MvdjEwLjAuMSIsImdpdGh1Yl9yZWZfdHlwZSI6InRhZyIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiNTAxMDA0MDc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJsYXVyZW50c2ltb24iLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lcl9pZCI6IjY0NTA1MDk5IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIyNDY0ODI3ODI5IiwiZ2l0aHViX3J1bl9udW1iZXIiOiI2IiwiZ2l0aHViX3NoYTEiOiI2Y2QyOWRkMWNmMmM3MmYwNTM5YjUwNDA1ZDc1MzM4NTU1MzY2MzUxIiwib3MiOiJ1YnVudHUyMCJ9fSwiYnVpbGRDb25maWciOnsidmVyc2lvbiI6MSwic3RlcHMiOlt7ImNvbW1hbmQiOlsiL29wdC9ob3N0ZWR0b29sY2FjaGUvZ28vMS4xNy4xMC94NjQvYmluL2dvIiwibW9kIiwidmVuZG9yIl0sImVudiI6bnVsbCwid29ya2luZ0RpciI6Ii9ob21lL3J1bm5lci93b3JrL3Njb3JlY2FyZC1jb3B5L3Njb3JlY2FyZC1jb3B5In0seyJjb21tYW5kIjpbIi9vcHQvaG9zdGVkdG9vbGNhY2hlL2dvLzEuMTcuMTAveDY0L2Jpbi9nbyIsImJ1aWxkIiwiLW1vZD12ZW5kb3IiLCItdHJpbXBhdGgiLCItdGFncz1uZXRnbyIsIi1sZGZsYWdzPS1zIC1YIHNpZ3MuazhzLmlvL3JlbGVhc2UtdXRpbHMvdmVyc2lvbi5naXRWZXJzaW9uPXYxMC4wLjEgLVggc2lncy5rOHMuaW8vcmVsZWFzZS11dGlscy92ZXJzaW9uLmdpdENvbW1pdD02Y2QyOWRkMWNmMmM3MmYwNTM5YjUwNDA1ZDc1MzM4NTU1MzY2MzUxIC1YIHNpZ3MuazhzLmlvL3JlbGVhc2UtdXRpbHMvdmVyc2lvbi5naXRUcmVlU3RhdGU9Y2xlYW4gLVggc2lncy5rOHMuaW8vcmVsZWFzZS11dGlscy92ZXJzaW9uLmJ1aWxkRGF0ZT0xNjU0NzI4NTE3IC13IC1leHRsZGZsYWdzIFwiLXN0YXRpY1wiIiwiLW8iLCJzY29yZWNhcmQtbGludXgtYW1kNjQiXSwiZW52IjpbIkdPT1M9bGludXgiLCJHT0FSQ0g9YW1kNjQiLCJHTzExMU1PRFVMRT1vbiIsIkNHT19FTkFCTEVEPTAiXSwid29ya2luZ0RpciI6Ii9ob21lL3J1bm5lci93b3JrL3Njb3JlY2FyZC1jb3B5L3Njb3JlY2FyZC1jb3B5In1dfSwibWV0YWRhdGEiOnsiYnVpbGRJbnZvY2F0aW9uSUQiOiIyNDY0ODI3ODI5LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9sYXVyZW50c2ltb24vc2NvcmVjYXJkLWNvcHlAcmVmcy90YWdzL3YxMC4wLjEiLCJkaWdlc3QiOnsic2hhMSI6IjZjZDI5ZGQxY2YyYzcyZjA1MzliNTA0MDVkNzUzMzg1NTUzNjYzNTEifX0seyJ1cmkiOiJodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy92aXJ0dWFsLWVudmlyb25tZW50cy9yZWxlYXNlcy90YWcvdWJ1bnR1MjAvMjAyMjA1MjkuMSJ9XX19","signatures":[{"keyid":"","sig":"MEQCIDOfrIqWkHmrHJcW3qx7csxTndprBX/Y/QuDiL5KHa0FAiBGoYBFK/4lrXDpzG2ch+WAqU4WPxgx7nRulmyLhWVxIg=="}]} \ No newline at end of file