Skip to content

Commit 33fa73e

Browse files
renovate[bot]jamietanna
authored andcommitted
fix(deps): update module github.com/getkin/kin-openapi to v0.124.0
Note that, as noted in #1533, this version introduces a significant breaking changes, which requires us make code changes. The key change introduced is that we now have a `Types` type, which supports how in OpenAPI 3.1 (and JSON Schema proper) there can be multiple types. Note that we do not add the support for full OpenAPI 3.1 specifications (#373) and make sure that we only use the `.Is` call, which makes sure it's the 0th element, so we don't accidentally start to have OpenAPI 3.1 support before we're ready for it. Closes #1533.
1 parent cb61b77 commit 33fa73e

File tree

17 files changed

+50
-34
lines changed

17 files changed

+50
-34
lines changed

examples/authenticated-api/stdhttp/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ replace github.com/deepmap/oapi-codegen/v2 => ../../../
66

77
require (
88
github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
9-
github.com/getkin/kin-openapi v0.123.0
9+
github.com/getkin/kin-openapi v0.124.0
1010
github.com/lestrrat-go/jwx v1.2.29
1111
github.com/oapi-codegen/nethttp-middleware v1.0.1
1212
github.com/oapi-codegen/testutil v1.1.0

examples/authenticated-api/stdhttp/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
44
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
55
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
66
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
7-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
8-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
7+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
8+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
99
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
1010
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
1111
github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=

examples/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ replace github.com/deepmap/oapi-codegen/v2 => ../
66

77
require (
88
github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
9-
github.com/getkin/kin-openapi v0.123.0
9+
github.com/getkin/kin-openapi v0.124.0
1010
github.com/gin-gonic/gin v1.9.1
1111
github.com/go-chi/chi/v5 v5.0.10
1212
github.com/gofiber/fiber/v2 v2.49.1

examples/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0H
4242
github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
4343
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
4444
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
45-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
46-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
45+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
46+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
4747
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
4848
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
4949
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=

examples/minimal-server/stdhttp/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ replace github.com/deepmap/oapi-codegen/v2 => ../../../
77
require github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
88

99
require (
10-
github.com/getkin/kin-openapi v0.123.0 // indirect
10+
github.com/getkin/kin-openapi v0.124.0 // indirect
1111
github.com/go-openapi/jsonpointer v0.20.2 // indirect
1212
github.com/go-openapi/swag v0.22.8 // indirect
1313
github.com/invopop/yaml v0.2.0 // indirect

examples/minimal-server/stdhttp/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
4-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
3+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
4+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
55
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
66
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
77
github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=

examples/petstore-expanded/stdhttp/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ replace github.com/deepmap/oapi-codegen/v2 => ../../../
66

77
require (
88
github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
9-
github.com/getkin/kin-openapi v0.123.0
9+
github.com/getkin/kin-openapi v0.124.0
1010
github.com/oapi-codegen/nethttp-middleware v1.0.1
1111
github.com/oapi-codegen/runtime v1.1.0
1212
github.com/oapi-codegen/testutil v1.0.0

examples/petstore-expanded/stdhttp/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvF
55
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
66
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
77
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
9-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
8+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
9+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
1010
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
1111
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
1212
github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/deepmap/oapi-codegen/v2
33
go 1.20
44

55
require (
6-
github.com/getkin/kin-openapi v0.123.0
6+
github.com/getkin/kin-openapi v0.124.0
77
github.com/stretchr/testify v1.9.0
88
golang.org/x/text v0.15.0
99
golang.org/x/tools v0.20.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
4-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
3+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
4+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
55
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
66
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
77
github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=

internal/test/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ replace github.com/deepmap/oapi-codegen/v2 => ../../
66

77
require (
88
github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
9-
github.com/getkin/kin-openapi v0.123.0
9+
github.com/getkin/kin-openapi v0.124.0
1010
github.com/gin-gonic/gin v1.9.1
1111
github.com/go-chi/chi/v5 v5.0.10
1212
github.com/gofiber/fiber/v2 v2.49.1

internal/test/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0H
3939
github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
4040
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
4141
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
42-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
43-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
42+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
43+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
4444
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
4545
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
4646
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=

internal/test/strict-server/stdhttp/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ replace github.com/deepmap/oapi-codegen/v2/internal/test => ../..
99
require (
1010
github.com/deepmap/oapi-codegen/v2 v2.0.0-00010101000000-000000000000
1111
github.com/deepmap/oapi-codegen/v2/internal/test v0.0.0-00010101000000-000000000000
12-
github.com/getkin/kin-openapi v0.123.0
12+
github.com/getkin/kin-openapi v0.124.0
1313
github.com/oapi-codegen/runtime v1.1.0
1414
github.com/oapi-codegen/testutil v1.1.0
1515
github.com/stretchr/testify v1.9.0

internal/test/strict-server/stdhttp/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvF
55
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
66
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
77
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8-
github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8=
9-
github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
8+
github.com/getkin/kin-openapi v0.124.0 h1:VSFNMB9C9rTKBnQ/fpyDU8ytMTr4dWI9QovSKj9kz/M=
9+
github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM=
1010
github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
1111
github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
1212
github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw=

pkg/codegen/codegen.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,16 +1088,15 @@ func GoSchemaImports(schemas ...*openapi3.SchemaRef) (map[string]goImport, error
10881088
schemaVal := sref.Value
10891089

10901090
t := schemaVal.Type
1091-
switch t {
1092-
case "", "object":
1091+
if t.Slice() == nil || t.Is("object") {
10931092
for _, v := range schemaVal.Properties {
10941093
imprts, err := GoSchemaImports(v)
10951094
if err != nil {
10961095
return nil, err
10971096
}
10981097
MergeImports(res, imprts)
10991098
}
1100-
case "array":
1099+
} else if t.Is("array") {
11011100
imprts, err := GoSchemaImports(schemaVal.Items)
11021101
if err != nil {
11031102
return nil, err

pkg/codegen/merge_schemas.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func mergeOpenapiSchemas(s1, s2 openapi3.Schema, allOf bool) (openapi3.Schema, e
120120

121121
result.AllOf = append(s1.AllOf, s2.AllOf...)
122122

123-
if s1.Type != "" && s2.Type != "" && s1.Type != s2.Type {
123+
if s1.Type.Slice() != nil && s2.Type.Slice() != nil && !equalTypes(s1.Type, s2.Type) {
124124
return openapi3.Schema{}, errors.New("can not merge incompatible types")
125125
}
126126
result.Type = s1.Type
@@ -229,3 +229,21 @@ func mergeOpenapiSchemas(s1, s2 openapi3.Schema, allOf bool) (openapi3.Schema, e
229229

230230
return result, nil
231231
}
232+
233+
func equalTypes(t1 *openapi3.Types, t2 *openapi3.Types) bool {
234+
s1 := t1.Slice()
235+
s2 := t2.Slice()
236+
237+
if len(s1) != len(s2) {
238+
return false
239+
}
240+
241+
// NOTE that ideally we'd use `slices.Equal` but as we're currently supporting Go 1.20+, we can't use it (yet https://github.com/deepmap/oapi-codegen/issues/1634)
242+
for i := range s1 {
243+
if s1[i] != s2[i] {
244+
return false
245+
}
246+
}
247+
248+
return true
249+
}

pkg/codegen/schema.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,13 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) {
303303
// Schema type and format, eg. string / binary
304304
t := schema.Type
305305
// Handle objects and empty schemas first as a special case
306-
if t == "" || t == "object" {
306+
if t.Slice() == nil || t.Is("object") {
307307
var outType string
308308

309309
if len(schema.Properties) == 0 && !SchemaHasAdditionalProperties(schema) && schema.AnyOf == nil && schema.OneOf == nil {
310310
// If the object has no properties or additional properties, we
311311
// have some special cases for its type.
312-
if t == "object" {
312+
if t.Is("object") {
313313
// We have an object with no properties. This is a generic object
314314
// expressed as a map.
315315
outType = "map[string]interface{}"
@@ -537,8 +537,7 @@ func oapiSchemaToGoType(schema *openapi3.Schema, path []string, outSchema *Schem
537537
f := schema.Format
538538
t := schema.Type
539539

540-
switch t {
541-
case "array":
540+
if t.Is("array") {
542541
// For arrays, we'll get the type of the Items and throw a
543542
// [] in front of it.
544543
arrayType, err := GenerateGoSchema(schema.Items, path)
@@ -570,7 +569,7 @@ func oapiSchemaToGoType(schema *openapi3.Schema, path []string, outSchema *Schem
570569
outSchema.DefineViaAlias = false
571570
}
572571

573-
case "integer":
572+
} else if t.Is("integer") {
574573
// We default to int if format doesn't ask for something else.
575574
if f == "int64" {
576575
outSchema.GoType = "int64"
@@ -596,7 +595,7 @@ func oapiSchemaToGoType(schema *openapi3.Schema, path []string, outSchema *Schem
596595
outSchema.GoType = "int"
597596
}
598597
outSchema.DefineViaAlias = true
599-
case "number":
598+
} else if t.Is("number") {
600599
// We default to float for "number"
601600
if f == "double" {
602601
outSchema.GoType = "float64"
@@ -606,13 +605,13 @@ func oapiSchemaToGoType(schema *openapi3.Schema, path []string, outSchema *Schem
606605
return fmt.Errorf("invalid number format: %s", f)
607606
}
608607
outSchema.DefineViaAlias = true
609-
case "boolean":
608+
} else if t.Is("boolean") {
610609
if f != "" {
611610
return fmt.Errorf("invalid format (%s) for boolean", f)
612611
}
613612
outSchema.GoType = "bool"
614613
outSchema.DefineViaAlias = true
615-
case "string":
614+
} else if t.Is("string") {
616615
// Special case string formats here.
617616
switch f {
618617
case "byte":
@@ -635,7 +634,7 @@ func oapiSchemaToGoType(schema *openapi3.Schema, path []string, outSchema *Schem
635634
outSchema.GoType = "string"
636635
}
637636
outSchema.DefineViaAlias = true
638-
default:
637+
} else {
639638
return fmt.Errorf("unhandled Schema type: %s", t)
640639
}
641640
return nil

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy