Skip to content

Commit

Permalink
CLAIRE 4.1.0 beta release of October 2023
Browse files Browse the repository at this point in the history
  • Loading branch information
ycaseau committed Oct 22, 2023
1 parent 5b12c2a commit ea37ec4
Show file tree
Hide file tree
Showing 35 changed files with 872 additions and 864 deletions.
7 changes: 7 additions & 0 deletions compile/otool.cl
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ glb(x:Pattern,y:type_expression) : type_expression
else {}),
any {}))

// v4.1.0: need the symetrical formula
glb(x:type_expression,y:Pattern) : type_expression
-> (case x (Pattern (if (x.selector = y.selector) Pattern(selector = x.selector,
arg = glb(x.arg,y.arg))
else {}),
any {}))

// extension of <= for Patterns
[less?(x:Pattern,y:type_expression) : boolean
-> case y
Expand Down
5 changes: 3 additions & 2 deletions init.cl
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@ RELEASE:float :: 1.0 // version of September 23rd, 2023
/* // additions (comment out what you don't want)
begin(Core)
claire/ephemeral_object <: object()
end(Core) */
end(Core)
begin(Optimize)
*mod_integer* :: (mod @ integer)
end(Optimize)
begin(Generate)
// output :: property()
end(Generate)
*/

// end of additions

Expand Down
Binary file modified interpreter/macos/claire4
Binary file not shown.
2 changes: 1 addition & 1 deletion meta/control.cl
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ self_eval(self:Lselect) : any
(write_value(self.var, y), if (eval(self.arg) != false) res :add y)),
if known?(of,self)
(when x := some(x in res | not(x % self.of)) in // v3.1.06
range_error(mClaire/cause = self,arg = x,wrong = self.of),
range_error(mClaire/cause = self,arg = x, Core/wrong = self.of),
Kernel/cast!(res,self.of)),
res))

Expand Down
4 changes: 2 additions & 2 deletions meta/define.cl
Original file line number Diff line number Diff line change
Expand Up @@ -463,12 +463,12 @@ self_eval(self:Defarray) : any
else self.body)),
d := (case e (lambda unknown, any eval(self.body))) in
(write(range, ar, extract_pattern(self.set_arg, nil)),
if unknown?(range,ar) range_error(mClaire/cause = table, arg = self.set_arg, wrong = type), // v3.3.18
if unknown?(range,ar) range_error(mClaire/cause = table, arg = self.set_arg, Core/wrong = type), // v3.3.18
if (unknown?(d) & (ar.range <= integer | ar.range <= float))
trace(0,"=== CLAIRE4 Warning: unknown not allowed as a default for table with range ~S\n ",ar.range),
if known?(d)
(if not(d % ar.range) // v3.1.06
range_error(mClaire/cause = ar,arg = d, wrong = ar.range))
range_error(mClaire/cause = ar,arg = d, Core/wrong = ar.range))
else if (ar.range <= integer) d := 0
else if (ar.range <= float) d := 0.0, // v4.0: unknown not allowed as a float or int
put(range, v, s),
Expand Down
1 change: 1 addition & 0 deletions meta/inspect.cl
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ inspect(self:any) : any
-> let m0 := module!(), ix := 0 in
(case self
(list for i in (1 .. length(self)) printf("~A: ~S\n", i, self[i]),
set inspect(list!(self)),
object for rel in owner(self).slots
let m := module!(name(selector(rel))) in
(ix :+ 1, // ix is the position in the slots list
Expand Down
4 changes: 2 additions & 2 deletions meta/pretty.cl
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ self_eval(self:Variable) : any -> mClaire/get_stack(mClaire/base!() + self.index
write_value(self:Variable,val:any) : any
-> (if (unknown?(range, self) | val % self.range)
(mClaire/put_stack(mClaire/base!() + self.index, val), val)
else range_error(arg = self, mClaire/cause = val, wrong = self.range))
else range_error(arg = self, mClaire/cause = val, Core/wrong = self.range))

// this is the definition of a typed variable / Vardef is a syntactic marker
// in CLAIRE 4, Vardef are transformed in Var at run time
Expand All @@ -88,7 +88,7 @@ Control_structure <: Complex_instruction()
write_value(self:global_variable,val:any) : any
-> (if (val % self.range)
(put_store(value,self,val,self.store?), val)
else range_error(mClaire/cause = self, arg = val, wrong = self.range)) // v0.01
else range_error(mClaire/cause = self, arg = val, Core/wrong = self.range)) // v0.01


// same as C (used externC("((int) EOF",integer))
Expand Down
190 changes: 95 additions & 95 deletions src/Core/Core-meta.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of module Core.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:30 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:35 *****/

package Core
import (_ "fmt"
Expand Down Expand Up @@ -254,52 +254,6 @@ var C__backslash *ClaireOperation /*obj*/
var C_glb *ClaireOperation /*obj*/
var C_Core__inf_equalt *ClaireOperation /*obj*/
var C_Core__Zt *ClaireOperation /*obj*/
var C_factor_ask *ClaireProperty // claire/"factor?"
var C_divide_ask *ClaireProperty // claire/"divide?"
var C_Id *ClaireProperty // claire/"Id"
var C_Core_check_inverse *ClaireProperty // Core/"check_inverse"
var C_invert *ClaireProperty // claire/"invert"
var C_domain_I *ClaireProperty // claire/"domain!"
var C_methods *ClaireProperty // claire/"methods"
var C_mClaire_cause *ClaireProperty // mClaire/"cause"
var C_Core_wrong *ClaireProperty // Core/"wrong"
var C_format *ClaireProperty // claire/"format"
var C_Core_tformat *ClaireProperty // Core/"tformat"
var C_contradiction_I *ClaireProperty // claire/"contradiction!"
var C_mClaire_get_stack *ClaireProperty // mClaire/"get_stack"
var C_mClaire_put_stack *ClaireProperty // mClaire/"put_stack"
var C_mClaire_push_I *ClaireProperty // mClaire/"push!"
var C_time_get *ClaireProperty // claire/"time_get"
var C_time_set *ClaireProperty // claire/"time_set"
var C_time_show *ClaireProperty // claire/"time_show"
var C_print_in_string *ClaireProperty // claire/"print_in_string"
var C_mClaire_buffer_length *ClaireProperty // mClaire/"buffer_length"
var C_mClaire_buffer_set_length *ClaireProperty // mClaire/"buffer_set_length"
var C_not *ClaireProperty // claire/"not"
var C_externC *ClaireProperty // claire/"externC"
var C_getenv *ClaireProperty // claire/"getenv"
var C_last *ClaireProperty // claire/"last"
var C_rmlast *ClaireProperty // claire/"rmlast"
var C_car *ClaireProperty // claire/"car"
var C_sort *ClaireProperty // claire/"sort"
var C_Core_quicksort *ClaireProperty // Core/"quicksort"
var C_Core_build_powerset *ClaireProperty // Core/"build_powerset"
var C_difference *ClaireProperty // claire/"difference"
var C_Core_of_extract *ClaireProperty // Core/"of_extract"
var C_member *ClaireProperty // claire/"member"
var C_get_value *ClaireProperty // claire/"get_value"
var C_Core_enumerate *ClaireProperty // Core/"enumerate"
var C_Uall *ClaireProperty // claire/"Uall"
var C_unique_ask *ClaireProperty // claire/"unique?"
var C_the *ClaireProperty // claire/"the"
var C_Core_abstract_type *ClaireProperty // Core/"abstract_type"
var C_Core_insert_definition *ClaireProperty // Core/"insert_definition"
var C_mClaire_cpretty *ClaireProperty // mClaire/"cpretty"
var C_mClaire_cprevious *ClaireProperty // mClaire/"cprevious"
var C_mClaire_width *ClaireProperty // mClaire/"width"
var C_mClaire_pprint *ClaireProperty // mClaire/"pprint"
var C_mClaire_pbreak *ClaireProperty // mClaire/"pbreak"
var C_mClaire_set_base *ClaireProperty // mClaire/"set_base"
var C_mClaire_set_index *ClaireProperty // mClaire/"set_index"
var C_mClaire_update *ClaireProperty // mClaire/"update"
var C_make_set *ClaireProperty // claire/"make_set"
Expand Down Expand Up @@ -351,62 +305,62 @@ var C__plus *ClaireOperation // claire/"+"
var C_Core_identified_ask *ClaireProperty // Core/"identified?"
var C_identical_ask *ClaireProperty // claire/"identical?"
var C_Core_get_index *ClaireProperty // Core/"get_index"
var C_factor_ask *ClaireProperty // claire/"factor?"
var C_divide_ask *ClaireProperty // claire/"divide?"
var C_Id *ClaireProperty // claire/"Id"
var C_Core_check_inverse *ClaireProperty // Core/"check_inverse"
var C_invert *ClaireProperty // claire/"invert"
var C_domain_I *ClaireProperty // claire/"domain!"
var C_methods *ClaireProperty // claire/"methods"
var C_mClaire_cause *ClaireProperty // mClaire/"cause"
var C_Core_wrong *ClaireProperty // Core/"wrong"
var C_format *ClaireProperty // claire/"format"
var C_Core_tformat *ClaireProperty // Core/"tformat"
var C_contradiction_I *ClaireProperty // claire/"contradiction!"
var C_mClaire_get_stack *ClaireProperty // mClaire/"get_stack"
var C_mClaire_put_stack *ClaireProperty // mClaire/"put_stack"
var C_mClaire_push_I *ClaireProperty // mClaire/"push!"
var C_time_get *ClaireProperty // claire/"time_get"
var C_time_set *ClaireProperty // claire/"time_set"
var C_time_show *ClaireProperty // claire/"time_show"
var C_print_in_string *ClaireProperty // claire/"print_in_string"
var C_mClaire_buffer_length *ClaireProperty // mClaire/"buffer_length"
var C_mClaire_buffer_set_length *ClaireProperty // mClaire/"buffer_set_length"
var C_not *ClaireProperty // claire/"not"
var C_externC *ClaireProperty // claire/"externC"
var C_getenv *ClaireProperty // claire/"getenv"
var C_last *ClaireProperty // claire/"last"
var C_rmlast *ClaireProperty // claire/"rmlast"
var C_car *ClaireProperty // claire/"car"
var C_sort *ClaireProperty // claire/"sort"
var C_Core_quicksort *ClaireProperty // Core/"quicksort"
var C_Core_build_powerset *ClaireProperty // Core/"build_powerset"
var C_difference *ClaireProperty // claire/"difference"
var C_Core_of_extract *ClaireProperty // Core/"of_extract"
var C_member *ClaireProperty // claire/"member"
var C_get_value *ClaireProperty // claire/"get_value"
var C_Core_enumerate *ClaireProperty // Core/"enumerate"
var C_Uall *ClaireProperty // claire/"Uall"
var C_unique_ask *ClaireProperty // claire/"unique?"
var C_the *ClaireProperty // claire/"the"
var C_Core_abstract_type *ClaireProperty // Core/"abstract_type"
var C_Core_insert_definition *ClaireProperty // Core/"insert_definition"
var C_mClaire_cpretty *ClaireProperty // mClaire/"cpretty"
var C_mClaire_cprevious *ClaireProperty // mClaire/"cprevious"
var C_mClaire_width *ClaireProperty // mClaire/"width"
var C_mClaire_pprint *ClaireProperty // mClaire/"pprint"
var C_mClaire_pbreak *ClaireProperty // mClaire/"pbreak"
var C_mClaire_set_base *ClaireProperty // mClaire/"set_base"
var It *ClaireModule

// definition of the meta-model for module Core
func MetaLoad() {

It = MakeModule("Core",C_mClaire)
It.Comment = MakeString("Compiled on Saturday 09-23-2023 07:22:30(v4.1), lines:2426, warnings:7,safety:5")
It.Comment = MakeString("Compiled on Sunday 10-22-2023 07:00:35(v4.1), lines:2426, warnings:7,safety:5")
ClEnv.Module_I = It

// definition of the properties
C_factor_ask = MakeProperty("factor?",1,C_claire)
C_divide_ask = MakeProperty("divide?",1,C_claire)
C_Id = MakeProperty("Id",1,C_claire)
C_Core_check_inverse = MakeProperty("check_inverse",1,It)
C_invert = MakeProperty("invert",1,C_claire)
C_domain_I = MakeProperty("domain!",1,C_claire)
C_methods = MakeProperty("methods",1,C_claire)
C_mClaire_cause = MakeProperty("cause",1,C_mClaire)
C_Core_wrong = MakeProperty("wrong",1,It)
C_format = MakeProperty("format",1,C_claire)
C_Core_tformat = MakeProperty("tformat",1,It)
C_contradiction_I = MakeProperty("contradiction!",1,C_claire)
C_mClaire_get_stack = MakeProperty("get_stack",1,C_mClaire)
C_mClaire_put_stack = MakeProperty("put_stack",1,C_mClaire)
C_mClaire_push_I = MakeProperty("push!",1,C_mClaire)
C_time_get = MakeProperty("time_get",1,C_claire)
C_time_set = MakeProperty("time_set",1,C_claire)
C_time_show = MakeProperty("time_show",2,C_claire)
C_print_in_string = MakeProperty("print_in_string",1,C_claire)
C_mClaire_buffer_length = MakeProperty("buffer_length",1,C_mClaire)
C_mClaire_buffer_set_length = MakeProperty("buffer_set_length",1,C_mClaire)
C_not = MakeProperty("not",1,C_claire)
C_externC = MakeProperty("externC",1,C_claire)
C_getenv = MakeProperty("getenv",2,C_claire)
C_last = MakeProperty("last",1,C_claire)
C_rmlast = MakeProperty("rmlast",1,C_claire)
C_car = MakeProperty("car",1,C_claire)
C_sort = MakeProperty("sort",1,C_claire)
C_Core_quicksort = MakeProperty("quicksort",1,It)
C_Core_build_powerset = MakeProperty("build_powerset",1,It)
C_difference = MakeProperty("difference",1,C_claire)
C_Core_of_extract = MakeProperty("of_extract",1,It)
C_member = MakeProperty("member",1,C_claire)
C_get_value = MakeProperty("get_value",1,C_claire)
C_Core_enumerate = MakeProperty("enumerate",1,It)
C_Uall = MakeProperty("Uall",1,C_claire)
C_unique_ask = MakeProperty("unique?",1,C_claire)
C_the = MakeProperty("the",1,C_claire)
C_Core_abstract_type = MakeProperty("abstract_type",1,It)
C_Core_insert_definition = MakeProperty("insert_definition",1,It)
C_mClaire_cpretty = MakeProperty("cpretty",1,C_mClaire)
C_mClaire_cprevious = MakeProperty("cprevious",1,C_mClaire)
C_mClaire_width = MakeProperty("width",1,C_mClaire)
C_mClaire_pprint = MakeProperty("pprint",1,C_mClaire)
C_mClaire_pbreak = MakeProperty("pbreak",1,C_mClaire)
C_mClaire_set_base = MakeProperty("set_base",1,C_mClaire)
C_mClaire_set_index = MakeProperty("set_index",1,C_mClaire)
C_mClaire_update = MakeProperty("update",1,C_mClaire)
C_make_set = MakeProperty("make_set",1,C_claire)
Expand Down Expand Up @@ -458,6 +412,52 @@ func MetaLoad() {
C_Core_identified_ask = MakeProperty("identified?",1,It)
C_identical_ask = MakeProperty("identical?",1,C_claire)
C_Core_get_index = MakeProperty("get_index",1,It)
C_factor_ask = MakeProperty("factor?",1,C_claire)
C_divide_ask = MakeProperty("divide?",1,C_claire)
C_Id = MakeProperty("Id",1,C_claire)
C_Core_check_inverse = MakeProperty("check_inverse",1,It)
C_invert = MakeProperty("invert",1,C_claire)
C_domain_I = MakeProperty("domain!",1,C_claire)
C_methods = MakeProperty("methods",1,C_claire)
C_mClaire_cause = MakeProperty("cause",1,C_mClaire)
C_Core_wrong = MakeProperty("wrong",1,It)
C_format = MakeProperty("format",1,C_claire)
C_Core_tformat = MakeProperty("tformat",1,It)
C_contradiction_I = MakeProperty("contradiction!",1,C_claire)
C_mClaire_get_stack = MakeProperty("get_stack",1,C_mClaire)
C_mClaire_put_stack = MakeProperty("put_stack",1,C_mClaire)
C_mClaire_push_I = MakeProperty("push!",1,C_mClaire)
C_time_get = MakeProperty("time_get",1,C_claire)
C_time_set = MakeProperty("time_set",1,C_claire)
C_time_show = MakeProperty("time_show",2,C_claire)
C_print_in_string = MakeProperty("print_in_string",1,C_claire)
C_mClaire_buffer_length = MakeProperty("buffer_length",1,C_mClaire)
C_mClaire_buffer_set_length = MakeProperty("buffer_set_length",1,C_mClaire)
C_not = MakeProperty("not",1,C_claire)
C_externC = MakeProperty("externC",1,C_claire)
C_getenv = MakeProperty("getenv",2,C_claire)
C_last = MakeProperty("last",1,C_claire)
C_rmlast = MakeProperty("rmlast",1,C_claire)
C_car = MakeProperty("car",1,C_claire)
C_sort = MakeProperty("sort",1,C_claire)
C_Core_quicksort = MakeProperty("quicksort",1,It)
C_Core_build_powerset = MakeProperty("build_powerset",1,It)
C_difference = MakeProperty("difference",1,C_claire)
C_Core_of_extract = MakeProperty("of_extract",1,It)
C_member = MakeProperty("member",1,C_claire)
C_get_value = MakeProperty("get_value",1,C_claire)
C_Core_enumerate = MakeProperty("enumerate",1,It)
C_Uall = MakeProperty("Uall",1,C_claire)
C_unique_ask = MakeProperty("unique?",1,C_claire)
C_the = MakeProperty("the",1,C_claire)
C_Core_abstract_type = MakeProperty("abstract_type",1,It)
C_Core_insert_definition = MakeProperty("insert_definition",1,It)
C_mClaire_cpretty = MakeProperty("cpretty",1,C_mClaire)
C_mClaire_cprevious = MakeProperty("cprevious",1,C_mClaire)
C_mClaire_width = MakeProperty("width",1,C_mClaire)
C_mClaire_pprint = MakeProperty("pprint",1,C_mClaire)
C_mClaire_pbreak = MakeProperty("pbreak",1,C_mClaire)
C_mClaire_set_base = MakeProperty("set_base",1,C_mClaire)

// instructions from module sources
{
Expand Down Expand Up @@ -1048,7 +1048,7 @@ func MetaLoad() {

_CL_obj = C_claire_date
_CL_obj.Range = ToType(C_string.Id())
_CL_obj.Value = MakeString("Saturday 09-23-2023").Id()
_CL_obj.Value = MakeString("Sunday 10-22-2023").Id()
expr = F_close_global_variable(_CL_obj)
}
ErrorCheck(expr)}
Expand Down
2 changes: 1 addition & 1 deletion src/Core/function.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/meta/function.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:30 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:35 *****/

package Core
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Core/method.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/meta/method.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:30 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:35 *****/

package Core
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Core/object.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/meta/object.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:30 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:35 *****/

package Core
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Core/types.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/meta/types.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:30 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:35 *****/

package Core
import (_ "fmt"
Expand Down
4 changes: 2 additions & 2 deletions src/Generate/Generate-meta.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of module Generate.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down Expand Up @@ -282,7 +282,7 @@ var It *ClaireModule
func MetaLoad() {

It = MakeModule("Generate",Optimize.C_Compile)
It.Comment = MakeString("Compiled on Saturday 09-23-2023 07:22:33(v4.1), lines:3575, warnings:1,safety:5")
It.Comment = MakeString("Compiled on Sunday 10-22-2023 07:00:38(v4.1), lines:3575, warnings:1,safety:5")
ClEnv.Module_I = It

// definition of the properties
Expand Down
2 changes: 1 addition & 1 deletion src/Generate/goexp.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/compile/goexp.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Generate/gogen.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/compile/gogen.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Generate/gomain.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/compile/gomain.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Generate/gostat.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/compile/gostat.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down
2 changes: 1 addition & 1 deletion src/Generate/gosystem.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/***** CLAIRE Compilation of file /Users/ycaseau/Dropbox/src/clairev4.10/src/compile/gosystem.cl
[version 4.1 / safety 5] Saturday 09-23-2023 07:22:33 *****/
[version 4.1 / safety 5] Sunday 10-22-2023 07:00:38 *****/

package Generate
import (_ "fmt"
Expand Down
Loading

0 comments on commit ea37ec4

Please sign in to comment.