@effekt-lang/effekt 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/effekt +0 -0
- package/bin/effekt.sh +1 -1
- package/libraries/chez/common/effekt_primitives.ss +10 -2
- package/libraries/chez/common/immutable/cslist.effekt +13 -7
- package/libraries/chez/common/mutable/dict.effekt +8 -10
- package/libraries/chez/common/text/regex.effekt +7 -9
- package/libraries/common/args.effekt +95 -0
- package/libraries/common/array.effekt +225 -0
- package/libraries/common/bench.effekt +60 -0
- package/libraries/common/buffer.effekt +123 -0
- package/libraries/common/bytes.effekt +125 -0
- package/libraries/{chez/common/immutable → common}/dequeue.effekt +18 -4
- package/libraries/common/effekt.effekt +764 -0
- package/libraries/common/exception.effekt +122 -0
- package/libraries/common/io/console.effekt +66 -0
- package/libraries/common/io/error.effekt +365 -0
- package/libraries/common/io/files.effekt +282 -0
- package/libraries/common/io/network.effekt +105 -0
- package/libraries/common/io/time.effekt +15 -0
- package/libraries/common/io.effekt +158 -0
- package/libraries/{llvm/immutable → common}/list.effekt +83 -74
- package/libraries/common/option.effekt +72 -0
- package/libraries/common/process.effekt +10 -0
- package/libraries/common/queue.effekt +140 -0
- package/libraries/common/ref.effekt +63 -0
- package/libraries/common/result.effekt +45 -0
- package/libraries/{ml/immutable → common}/seq.effekt +30 -19
- package/libraries/common/string.effekt +395 -0
- package/libraries/common/test.effekt +98 -0
- package/libraries/js/effekt_builtins.js +37 -6
- package/libraries/js/io.js +143 -0
- package/libraries/js/mutable/map.effekt +8 -9
- package/libraries/js/text/regex.effekt +7 -8
- package/libraries/js/unsafe/cont.effekt +2 -2
- package/libraries/js/web/dom.effekt +13 -13
- package/libraries/llvm/array.c +53 -0
- package/libraries/llvm/buffer.c +181 -76
- package/libraries/llvm/forward-declare-c.ll +27 -8
- package/libraries/llvm/io.c +543 -1
- package/libraries/llvm/io.ll +19 -0
- package/libraries/llvm/main.c +3 -1
- package/libraries/llvm/ref.c +45 -0
- package/libraries/llvm/rts.ll +496 -354
- package/libraries/llvm/types.c +23 -0
- package/libraries/ml/effekt.sml +2 -0
- package/libraries/ml/internal/mllist.effekt +9 -0
- package/libraries/ml/internal/mloption.effekt +18 -0
- package/libraries/ml/random.effekt +9 -9
- package/libraries/ml/text/regex.effekt +14 -19
- package/licenses/eclipse public license, version 2.0 - epl-2.0.html +2 -2
- package/licenses/mit license - mit-license.html +527 -57
- package/licenses/the bsd license - bsd-license.html +530 -55
- package/licenses/the mit license - mit.html +528 -58
- package/package.json +2 -2
- package/libraries/chez/callcc/effekt.effekt +0 -221
- package/libraries/chez/common/effekt_matching.ss +0 -100
- package/libraries/chez/common/immutable/list.effekt +0 -643
- package/libraries/chez/common/immutable/option.effekt +0 -39
- package/libraries/chez/common/immutable/result.effekt +0 -29
- package/libraries/chez/common/io/args.effekt +0 -20
- package/libraries/chez/common/mutable/array.effekt +0 -27
- package/libraries/chez/common/mutable/heap.effekt +0 -12
- package/libraries/chez/common/test.effekt +0 -59
- package/libraries/chez/common/text/string.effekt +0 -46
- package/libraries/chez/lift/effekt.effekt +0 -217
- package/libraries/chez/monadic/effekt.effekt +0 -218
- package/libraries/js/effekt.effekt +0 -284
- package/libraries/js/effekt_matching.js +0 -79
- package/libraries/js/immutable/dequeue.effekt +0 -78
- package/libraries/js/immutable/list.effekt +0 -643
- package/libraries/js/immutable/option.effekt +0 -49
- package/libraries/js/immutable/result.effekt +0 -29
- package/libraries/js/io/args.effekt +0 -9
- package/libraries/js/io/async.effekt +0 -28
- package/libraries/js/io/async.js +0 -2
- package/libraries/js/io/file.effekt +0 -50
- package/libraries/js/io/file_include.js +0 -13
- package/libraries/js/mutable/array.effekt +0 -98
- package/libraries/js/mutable/heap.effekt +0 -32
- package/libraries/js/test.effekt +0 -59
- package/libraries/js/text/string.effekt +0 -64
- package/libraries/llvm/effekt.effekt +0 -243
- package/libraries/llvm/immutable/option.effekt +0 -53
- package/libraries/llvm/immutable/result.effekt +0 -29
- package/libraries/llvm/io/args.effekt +0 -24
- package/libraries/llvm/text/string.effekt +0 -179
- package/libraries/ml/effekt.effekt +0 -267
- package/libraries/ml/immutable/dequeue.effekt +0 -81
- package/libraries/ml/immutable/list.effekt +0 -674
- package/libraries/ml/immutable/option.effekt +0 -53
- package/libraries/ml/immutable/result.effekt +0 -29
- package/libraries/ml/internal/option.effekt +0 -18
- package/libraries/ml/io/args.effekt +0 -41
- package/libraries/ml/mutable/array.effekt +0 -43
- package/libraries/ml/test.effekt +0 -60
- package/libraries/ml/text/string.effekt +0 -81
package/libraries/llvm/types.c
CHANGED
|
@@ -5,11 +5,21 @@
|
|
|
5
5
|
typedef int64_t Int;
|
|
6
6
|
typedef double Double;
|
|
7
7
|
|
|
8
|
+
struct Header {
|
|
9
|
+
uint64_t rc;
|
|
10
|
+
void (*eraser)(void *);
|
|
11
|
+
};
|
|
12
|
+
|
|
8
13
|
struct Pos {
|
|
9
14
|
uint64_t tag; // type-local tag
|
|
10
15
|
void *obj; // pointer into the heap
|
|
11
16
|
};
|
|
12
17
|
|
|
18
|
+
struct Neg {
|
|
19
|
+
void *vtable;
|
|
20
|
+
void *obj;
|
|
21
|
+
};
|
|
22
|
+
|
|
13
23
|
static const struct Pos Unit = (struct Pos) { .tag = 0, .obj = NULL, };
|
|
14
24
|
static const struct Pos BooleanFalse = (struct Pos) { .tag = 0, .obj = NULL, };
|
|
15
25
|
static const struct Pos BooleanTrue = (struct Pos) { .tag = 1, .obj = NULL, };
|
|
@@ -17,4 +27,17 @@ static const struct Pos BooleanTrue = (struct Pos) { .tag = 1, .obj = NULL, };
|
|
|
17
27
|
typedef struct Pos String;
|
|
18
28
|
|
|
19
29
|
|
|
30
|
+
// Defined in rts.ll
|
|
31
|
+
|
|
32
|
+
extern void run(struct Neg);
|
|
33
|
+
extern void run_i64(struct Neg, int64_t);
|
|
34
|
+
extern void run_Pos(struct Neg, struct Pos);
|
|
35
|
+
|
|
36
|
+
// Reference counting primitives defined in LLVM
|
|
37
|
+
extern void eraseNegative(struct Neg);
|
|
38
|
+
extern void erasePositive(struct Pos);
|
|
39
|
+
|
|
40
|
+
extern void shareNegative(struct Neg);
|
|
41
|
+
extern void sharePositive(struct Pos);
|
|
42
|
+
|
|
20
43
|
#endif
|
package/libraries/ml/effekt.sml
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module internal/mllist
|
|
2
|
+
|
|
3
|
+
extern type MLList[Elem] // = 'elem list
|
|
4
|
+
extern pure def isEmpty[A](l: MLList[A]): Bool = ml "null ${l}"
|
|
5
|
+
extern pure def head[A](l: MLList[A]): A = ml "hd ${l}"
|
|
6
|
+
extern pure def tail[A](l: MLList[A]): MLList[A] = ml "tl ${l}"
|
|
7
|
+
|
|
8
|
+
def toList[A](l: MLList[A]): List[A] =
|
|
9
|
+
if (l.isEmpty) Nil() else Cons(l.head, toList(l.tail))
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module internal/mloption
|
|
2
|
+
|
|
3
|
+
import effekt
|
|
4
|
+
import option
|
|
5
|
+
|
|
6
|
+
extern type MLOption[T]
|
|
7
|
+
|
|
8
|
+
extern pure def isDefined[T](opt: MLOption[T]): Bool =
|
|
9
|
+
ml "Option.isSome ${opt}"
|
|
10
|
+
|
|
11
|
+
def isEmpty[T](opt: MLOption[T]): Bool = not(opt.isDefined())
|
|
12
|
+
|
|
13
|
+
extern pure def force[T](opt: MLOption[T]): T =
|
|
14
|
+
ml "Option.valOf ${opt}"
|
|
15
|
+
|
|
16
|
+
def toOption[T](opt: MLOption[T]): Option[T] = {
|
|
17
|
+
if (isDefined(opt)) Some(force(opt)) else None()
|
|
18
|
+
}
|
|
@@ -10,12 +10,12 @@ module random
|
|
|
10
10
|
* effect [[Random]], below.
|
|
11
11
|
*/
|
|
12
12
|
extern type RNG // = int * int
|
|
13
|
-
extern io def seed(n: Int, m: Int): RNG = "Random.rand (${n}, ${m})"
|
|
14
|
-
extern pure def toString(s: RNG): String = "Random.toString ${s}"
|
|
13
|
+
extern io def seed(n: Int, m: Int): RNG = ml "Random.rand (${n}, ${m})"
|
|
14
|
+
extern pure def toString(s: RNG): String = ml "Random.toString ${s}"
|
|
15
15
|
|
|
16
|
-
extern io def int(s: RNG): Int = "Random.randInt ${s}"
|
|
17
|
-
extern io def int(s: RNG, from: Int, to: Int): Int = "Random.randRange (${from}, ${to}) ${s}"
|
|
18
|
-
extern io def double(s: RNG): Double = "Random.randReal ${s}"
|
|
16
|
+
extern io def int(s: RNG): Int = ml "Random.randInt ${s}"
|
|
17
|
+
extern io def int(s: RNG, from: Int, to: Int): Int = ml "Random.randRange (${from}, ${to}) ${s}"
|
|
18
|
+
extern io def double(s: RNG): Double = ml "Random.randReal ${s}"
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -29,15 +29,15 @@ extern io def double(s: RNG): Double = "Random.randReal ${s}"
|
|
|
29
29
|
*/
|
|
30
30
|
extern type PseudoRNG
|
|
31
31
|
extern pure def random(s: PseudoRNG): PseudoRNG =
|
|
32
|
-
"Rand.random ${s}"
|
|
32
|
+
ml "Rand.random ${s}"
|
|
33
33
|
extern pure def range(s: PseudoRNG, n: Int, m: Int): Int =
|
|
34
|
-
"Rand.range (${n}, ${m}) ${s}"
|
|
34
|
+
ml "Rand.range (${n}, ${m}) ${s}"
|
|
35
35
|
extern pure def norm(s: PseudoRNG): Double =
|
|
36
|
-
"Rand.norm ${s}"
|
|
36
|
+
ml "Rand.norm ${s}"
|
|
37
37
|
|
|
38
38
|
// converting two integers into a word that is between randMin and randMax is completely made up
|
|
39
39
|
extern pure def pseudo(n: Int, m: Int): PseudoRNG =
|
|
40
|
-
"Word.fromInt ((Word.toInt Rand.randMin) + ((abs (${n} * ${m})) mod (Word.toInt Rand.randMax)))"
|
|
40
|
+
ml "Word.fromInt ((Word.toInt Rand.randMin) + ((abs (${n} * ${m})) mod (Word.toInt Rand.randMax)))"
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
module text/regex
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
extern pure def head[A](l: MLList[A]): A = "hd ${l}"
|
|
6
|
-
extern pure def tail[A](l: MLList[A]): MLList[A] = "tl ${l}"
|
|
7
|
-
|
|
8
|
-
def toList[A](l: MLList[A]): List[A] =
|
|
9
|
-
if (l.isEmpty) Nil() else Cons(l.head, toList(l.tail))
|
|
3
|
+
import internal/mllist
|
|
4
|
+
import internal/mloption
|
|
10
5
|
|
|
11
6
|
extern type Char // TODO move to text/string
|
|
12
7
|
type Chars = MLList[Char]
|
|
13
8
|
|
|
14
9
|
|
|
15
|
-
extern pure def chars(str: String): Chars = "String.explode ${str}"
|
|
16
|
-
extern pure def toString(chars: Chars): String = "String.implode ${chars}"
|
|
10
|
+
extern pure def chars(str: String): Chars = ml "String.explode ${str}"
|
|
11
|
+
extern pure def toString(chars: Chars): String = ml "String.implode ${chars}"
|
|
17
12
|
|
|
18
|
-
extern """
|
|
13
|
+
extern ml """
|
|
19
14
|
|
|
20
15
|
(** The RegExp module is created by choosing a parser (P) and an engine (E)
|
|
21
16
|
* for regular expressions.
|
|
@@ -42,7 +37,7 @@ record Match(matched: String)
|
|
|
42
37
|
|
|
43
38
|
// TODO handle CannotParse and CannotCompile ml exceptions.
|
|
44
39
|
extern pure def regex(regexString: String): Regex =
|
|
45
|
-
"RegExp.compileString ${regexString}"
|
|
40
|
+
ml "RegExp.compileString ${regexString}"
|
|
46
41
|
|
|
47
42
|
|
|
48
43
|
// A stream of elements of type Elem, read from a source of type Source
|
|
@@ -52,7 +47,7 @@ extern type MLStream[Elem, Source] // = ('elem, 'source) StringCvt.reader
|
|
|
52
47
|
// <https://www.smlnj.org/doc/smlnj-lib/RegExp/str-MatchTree.html>
|
|
53
48
|
extern type MLMatchResult // = match * char list
|
|
54
49
|
|
|
55
|
-
extern """
|
|
50
|
+
extern ml """
|
|
56
51
|
type regex_match = {len: int, pos: char list} MatchTree.match_tree;
|
|
57
52
|
fun matchedString (match : regex_match * char list) =
|
|
58
53
|
let val res = MatchTree.root (#1 match)
|
|
@@ -76,25 +71,25 @@ fun unsafeSplit str sep =
|
|
|
76
71
|
"""
|
|
77
72
|
|
|
78
73
|
extern pure def getMatch(result: MLMatchResult): String =
|
|
79
|
-
"matchedString ${result}"
|
|
74
|
+
ml "matchedString ${result}"
|
|
80
75
|
extern pure def getRemainder(result: MLMatchResult): Chars =
|
|
81
|
-
"remainderChars ${result}"
|
|
76
|
+
ml "remainderChars ${result}"
|
|
82
77
|
|
|
83
78
|
extern pure def unsafeSplit(str: String, ch: Char): MLList[String] =
|
|
84
|
-
"String.fields (fn c => c = ${ch}) ${str}"
|
|
79
|
+
ml "String.fields (fn c => c = ${ch}) ${str}"
|
|
85
80
|
|
|
86
81
|
extern pure def unsafeMatchPrefix(r: Regex, str: Chars): MLOption[MLMatchResult] =
|
|
87
|
-
"RegExp.prefix ${r} List.getItem ${str}"
|
|
82
|
+
ml "RegExp.prefix ${r} List.getItem ${str}"
|
|
88
83
|
|
|
89
84
|
extern pure def unsafeSplit(str: String, sep: String): MLList[String] =
|
|
90
|
-
"unsafeSplit ${str} ${sep}"
|
|
85
|
+
ml "unsafeSplit ${str} ${sep}"
|
|
91
86
|
|
|
92
|
-
extern """
|
|
87
|
+
extern ml """
|
|
93
88
|
val NEWLINE_CHAR = #"\n";
|
|
94
89
|
"""
|
|
95
90
|
|
|
96
91
|
extern pure def unsafeLines(str: String): MLList[String] =
|
|
97
|
-
"String.fields (fn c => c = NEWLINE_CHAR) ${str}"
|
|
92
|
+
ml "String.fields (fn c => c = NEWLINE_CHAR) ${str}"
|
|
98
93
|
|
|
99
94
|
def lines(str: String): List[String] = unsafeLines(str).toList
|
|
100
95
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=
|
|
1
|
+
<!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1726491576"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a class=sr-only href=#content>Skip to main content</a><header class="header-wrapper header-wrapper" id=header><div class=header-toolbar><div class=container><div class=header-toolbar-row><div class="toolbar-btn toolbar-search-btn dropdown"><button class=dropdown-toggle id=toolbar-search type=button data-toggle=dropdown tabindex=0 aria-label=Search>
|
|
2
2
|
<i class="fa fa-search fa-lg" aria-role=none></i></button><div class="toolbar-search-bar-wrapper dropdown-menu dropdown-menu-right" aria-labelledby=toolbar-search><form action=https://www.eclipse.org/home/search method=get><div class=search-bar><input class=search-bar-input name=q placeholder=Search>
|
|
3
3
|
<button>
|
|
4
4
|
<i class="fa fa-search" type=submit></i></button></div></form></div></div><div class="toolbar-btn toolbar-user-menu-btn dropdown"><button class=dropdown-toggle id=toolbar-user-menu type=button data-toggle=dropdown tabindex=0 aria-label="User Menu">
|
|
@@ -57,5 +57,5 @@ open source software collaboration and innovation.</p></div><div class=mega-menu
|
|
|
57
57
|
<i class="fa fa-linkedin fa-stack-1x fa-inverse" aria-hidden=true></i>
|
|
58
58
|
<span class=sr-only>Linkedin account</span></span></a></li></ul></div></div><div class="footer-sections row equal-height-md font-bold"><div class=col-md-15><div class=row><section id=footer-eclipse-foundation class="footer-section col-sm-8"><div class=menu-heading>Eclipse Foundation</div><ul class=nav><li><a href=https://www.eclipse.org/org/>About</a></li><li><a href=https://projects.eclipse.org/>Projects</a></li><li><a href=https://www.eclipse.org/collaborations/>Collaborations</a></li><li><a href=https://www.eclipse.org/membership/>Membership</a></li><li><a href=https://www.eclipse.org/sponsor/>Sponsor</a></li></ul></section><section id=footer-legal class="footer-section col-sm-8"><div class=menu-heading>Legal</div><ul class=nav><li><a href=https://www.eclipse.org/legal/privacy/>Privacy Policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of Use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php>Code of Conduct</a></li><li><a href=https://www.eclipse.org/legal/>Legal Resources</a></li><li><a class=toolbar-manage-cookies href=# onclick=event.preventDefault()>Manage Cookies</a></li></ul></section><section id=footer-more class="footer-section col-sm-8"><div class=menu-heading>More</div><ul class=nav><li><a href=https://www.eclipse.org/security/>Report a Vulnerability</a></li><li><a href=https://status.eclipse.org/>Service Status</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact Us</a></li><li><a href=https://www.eclipse.org/projects/support/>Support</a></li></ul></section></div></div><div id=footer-end class="footer-section col-md-8 col-md-offset-1 col-sm-24"><div class=footer-end-newsletter><form id=mc-embedded-subscribe-form action=https://eclipsecon.us6.list-manage.com/subscribe/post method=post novalidate target=_blank><label class=footer-end-newsletter-label for=email>Subscribe to our Newsletter</label><div class=footer-end-newsletter-input-wrapper><input class=footer-end-newsletter-input type=email id=email name=EMAIL autocomplete=email placeholder="Enter your email address"><div><i class="fa fa-solid fa-envelope fa-lg" aria-hidden=true></i></div></div><input type=hidden name=u value=eaf9e1f06f194eadc66788a85>
|
|
59
59
|
<input type=hidden name=id value=46e57eacf1>
|
|
60
|
-
<input id=mc-embedded-subscribe type=submit name=subscribe hidden></form></div></div></div><div class="col-sm-24 margin-top-20"><div class=row><div id=copyright class=col-md-16><p id=copyright-text>Copyright © Eclipse Foundation AISBL. All Rights Reserved.</p></div></div></div><a href=# class=scrollup>Back to the top</a></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=
|
|
60
|
+
<input id=mc-embedded-subscribe type=submit name=subscribe hidden></form></div></div></div><div class="col-sm-24 margin-top-20"><div class=row><div id=copyright class=col-md-16><p id=copyright-text>Copyright © Eclipse Foundation AISBL. All Rights Reserved.</p></div></div></div><a href=# class=scrollup>Back to the top</a></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1726491576"></script>
|
|
61
61
|
<script>(function(){})(jQuery,document)</script></div></body></html>
|