Slide 1

Slide 1 text

Dave Herman ES6 Deep Dive Symbols, Structs, Generators

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

About me • @littlecalculist • http://calculist.org • http://github.com/dherman • Mozilla Research • TC39 • Also…

Slide 4

Slide 4 text

In print this December http://effectivejs.com

Slide 5

Slide 5 text

Symbols

Slide 6

Slide 6 text

JS property names are strings var obj = { foo: 42 }; obj["foo"]; // 42

Slide 7

Slide 7 text

The all-powerful _ character function Dict() { this._entries = {}; } Don’t touch me, I’m private!

Slide 8

Slide 8 text

When you mean business… __proto__ private SO PRIVATE REALLY GUYS SOOO TOTALLY PRIVATE private!

Slide 9

Slide 9 text

Conventions are no guarantee function SuperClass() { this._data = "superclass private data"; } function SubClass() { SuperClass.call(this); this._data = "subclass private data"; // collision! } SubClass.prototype = Object.create(SuperClass.prototype);

Slide 10

Slide 10 text

Closures for information hiding function SuperClass() { var data = "private data"; this.method = function() { /* ... */ data /* ... */ }; } no sharing: one method per instance!

Slide 11

Slide 11 text

Introducing symbols

Slide 12

Slide 12 text

Introducing symbols var sym = new Symbol("data");

Slide 13

Slide 13 text

Introducing symbols var sym = new Symbol("data"); function SuperClass() { this[sym] = "private data"; }

Slide 14

Slide 14 text

Introducing symbols var sym = new Symbol("data"); function SuperClass() { this[sym] = "private data"; } SuperClass.prototype.method = function() { /* ... */ this[sym] /* ... */ };

Slide 15

Slide 15 text

Introducing symbols var obj = new SuperClass(); "data" in obj; // false "_data" in obj; // false sym in obj; // true

Slide 16

Slide 16 text

Performance • Engines already do string interning • Convertible to a fixed offset with inline caches

Slide 17

Slide 17 text

Proposal: scoped symbols private @sym; function SuperClass() { this.@sym = "private data"; } SuperClass.prototype.method = function() { /* ... */ this.@sym /* ... */ };

Slide 18

Slide 18 text

Structured binary data

Slide 19

Slide 19 text

Typed arrays var a = new Uint32Array(1024); a[17] = 42;

Slide 20

Slide 20 text

Typed arrays var vertices = new Float32Array([ -1.0, -1.0, 0.0, // vertex 1 0.0, 1.0, 0.0, // vertex 2 1.0, -1.0, 0.0 // vertex 3 ]); -1.0 -1.0 0.0 0.0 1.0 0.0 1.0 -1.0 0.0 0 4 8 12 16 20 24 28 32

Slide 21

Slide 21 text

Structs var Point = struct({ x: float32, y: float32, z: float32 }); var origin = new Point(0.0, 0.0, 0.0); origin.x; // 0.0 origin.y; // 0.0

Slide 22

Slide 22 text

Arrays of structs var vertices = new Point.array([ { x: -1.0, y: -1.0, z: 0.0 }, { x: 0.0, y: 1.0, z: 0.0 }, { x: 1.0, y: -1.0, z: 0.0 } ]); -1.0 -1.0 0.0 0.0 1.0 0.0 1.0 -1.0 0.0 0 4 8 12 16 20 24 28 32

Slide 23

Slide 23 text

JIT compilers — types

Slide 24

Slide 24 text

Applications of structs • WebGL data • File and network I/O • Compiling other languages to JS

Slide 25

Slide 25 text

Generators

Slide 26

Slide 26 text

Lies, lies, lies “JS doesn’t have concurrency.” “JS is single-threaded so it can’t have race conditions.” “Event-based programming is easy.”

Slide 27

Slide 27 text

Download three files load("foo", function(foo) { load("bar", function(bar) { // why wait? load("baz", function(baz) { use([foo, bar, baz]); }); }); });

Slide 28

Slide 28 text

Download three files load("foo", function(foo) { load("bar", function(bar) { // why wait? load("baz", function(baz) { use([foo, bar, baz]); }); }); });

Slide 29

Slide 29 text

Download three files var files = []; ["foo", "bar", "baz"].forEach(function(url, i) { load(url, function(file) { files.push(file); // no! if (i === 3) // no! use(files); }); });

Slide 30

Slide 30 text

Download three files var files = []; ["foo", "bar", "baz"].forEach(function(url, i) { load(url, function(file) { files[i] = file; if (files.length === 3) // still no! use(files); }); });

Slide 31

Slide 31 text

Download three files var files = [], count = 0; ["foo", "bar", "baz"].forEach(function(url, i) { load(url, function(file) { files[i] = file; if (++count === 3) use(files); }); });

Slide 32

Slide 32 text

JavaScript is concurrent Cooperative concurrency: easier, but not easy! Handlers run sequentially but start concurrently. Shared state 㱺 race conditions 㱺 pain and suffering

Slide 33

Slide 33 text

task.js: Beautiful concurrency spawn(function*() { var files = yield join(load("foo"), load("bar"), load("baz")); use(files); }); http://taskjs.org

Slide 34

Slide 34 text

task.js: Beautiful concurrency spawn(function*() { var files = yield join(load("foo"), load("bar"), load("baz")); use(files); }); create a task that can be paused pause! http://taskjs.org

Slide 35

Slide 35 text

Generator functions function* evenNumbers() { for (var next = 0; true; next += 2) { yield next; } }

Slide 36

Slide 36 text

Generator functions function* evenNumbers() { for (var next = 0; true; next += 2) { yield next; } }

Slide 37

Slide 37 text

Generator functions function* evenNumbers() { for (var next = 0; true; next += 2) { yield next; } } evenNumbers(); ✗

Slide 38

Slide 38 text

Generator functions function* evenNumbers() { for (var next = 0; true; next += 2) { yield next; } } evenNumbers(); ✗

Slide 39

Slide 39 text

Generators function* f() { }

Slide 40

Slide 40 text

Generators function* f() { } .next: var g = f(); ⋮

Slide 41

Slide 41 text

Generators function* evenNumbers() { /* ... */ } var g = evenNumbers(); g.next(); // 0 g.next(); // 2 g.next(); // 4 starts out paused

Slide 42

Slide 42 text

Lazy iteration Dict.prototype.keys = function*() { for (var key in this._entries) yield key; };

Slide 43

Slide 43 text

Iterators work with for-of var dict = new Dict(); // ... for (var key of dict.keys()) { console.log(key + ": " + dict.get(key)); }

Slide 44

Slide 44 text

Pausing is powerful load("config.json", function(config) { db.lookup(JSON.parse(config).table, username, function(user) { load(user.id + ".png", function(avatar) { // ... }); }); });

Slide 45

Slide 45 text

Pausing is powerful load("config.json", function(config) { db.lookup(JSON.parse(config).table, username, function(user) { load(user.id + ".png", function(avatar) { // ... }); }); }); later later later

Slide 46

Slide 46 text

Pausing is powerful load("config.json", function(config) { db.lookup(JSON.parse(config).table, username, function(user) { load(user.id + ".png", function(avatar) { // ... }); }); }); later later later

Slide 47

Slide 47 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 48

Slide 48 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 49

Slide 49 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 50

Slide 50 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 51

Slide 51 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 52

Slide 52 text

Pausing with promises load("config.json") .then(function(config) { return db.lookup(JSON.parse(config).table); }) .then(function(user) { return load(user.id + ".png"); }) .then(function(avatar) { /* ... */ });

Slide 53

Slide 53 text

Tasks yield promises spawn(function*() { var config = JSON.parse(yield load("config.json")); var user = yield db.lookup(config.table, username); var avatar = yield load(user.id + ".png"); // ... });

Slide 54

Slide 54 text

Tasks yield promises spawn(function*() { var config = JSON.parse(yield load("config.json")); var user = yield db.lookup(config.table, username); var avatar = yield load(user.id + ".png"); // ... });

Slide 55

Slide 55 text

Tasks yield promises spawn(function*() { var config = JSON.parse(yield load("config.json")); var user = yield db.lookup(config.table, username); var avatar = yield load(user.id + ".png"); // ... }); looks like a synchronous API!

Slide 56

Slide 56 text

What about errors? load("foo", function(foo) { load("bar", function(bar) { load("baz", function(baz) { use([foo, bar, baz]); }, function(err) { /* ... */ }); }, function(err) { /* ... */ }); }, function(err) { /* ... */ });

Slide 57

Slide 57 text

What about errors? load("foo", function(err, foo) { if (err) return onError(err); load("bar", function(err, bar) { if (err) return onError(err); load("baz", function(err, baz) { if (err) return onError(err); use([foo, bar, baz]); }); }); });

Slide 58

Slide 58 text

Error handling with promises var p = load("config.json") .then(function(config) { /* ... */ } .then(function(user) { /* ... */ }) .then(function(avatar) { /* ... */ }); when(p, function(result) { /* ... */ }, function(err) { /* ... */ });

Slide 59

Slide 59 text

Error handling with tasks spawn(function*() { try { var config = JSON.parse(yield load("config.json")); var user = yield db.lookup(config.table, username); var avatar = yield load(user.id + ".png"); // ... } catch (e) { /* ... */ } });

Slide 60

Slide 60 text

Wait for multiple events spawn(function*() { var [foo, bar, baz] = yield join(load("foo"), load("bar"), load("baz")); // ... });

Slide 61

Slide 61 text

Purposefully race events spawn(function*() { try { var foo = yield select(load("foo"), timeout(3000)); // ... } catch (e) { /* timed out */ } });

Slide 62

Slide 62 text

Generators • Interruptible computations 㱺 custom iterators • Pausing with yield 㱺 concurrency minus the callbacks

Slide 63

Slide 63 text

Something completely different

Slide 64

Slide 64 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]

Slide 65

Slide 65 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]

Slide 66

Slide 66 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "[object Object]"

Slide 67

Slide 67 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "[object Object]"

Slide 68

Slide 68 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "[object Object]" true true true

Slide 69

Slide 69 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "[object Object]" 3

Slide 70

Slide 70 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "j"

Slide 71

Slide 71 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "false" "j"

Slide 72

Slide 72 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "false" 3 "j"

Slide 73

Slide 73 text

({}+[])[!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]] "j" "s"

Slide 74

Slide 74 text

! + { } [ ] ( ) \n === JavaScript

Slide 75

Slide 75 text

Um. So… why?

Slide 76

Slide 76 text

• No reason. Um. So… why?

Slide 77

Slide 77 text

• Yosuke Hasegawa: JSF*ck • Patricio Palladino: Hieroglyphy • Me: pure JS, no browser API’s Not the first deranged weirdo

Slide 78

Slide 78 text

> String+[] "function String() { [native code] }" "S"

Slide 79

Slide 79 text

> "".constructor+[] "function String() { [native code] }" "S"

Slide 80

Slide 80 text

> ""["constructor"]+[] "function String() { [native code] }" "S"

Slide 81

Slide 81 text

> [].slice.call(""["constructor"]+[]) ["f","u","n","c","t","i","o","n"," ","S","t","r", /* ... */] "S"

Slide 82

Slide 82 text

> [].slice.call(""["constructor"]+[]) [" ","f","u","n","c","t","i","o","n"," ","S","t","r", /* ... */] "S"

Slide 83

Slide 83 text

> function nonWhitespace(s) { return !/^\s*$/.test(s) } > [].slice.call(""["constructor"]+[]).filter(nonWhitespace) ["f","u","n","c","t","i","o","n","S","t","r", /* ... */] "S"

Slide 84

Slide 84 text

> Number("f") NaN > Number(" ") 0 > isNaN("f") true > isNaN(" ") false "S"

Slide 85

Slide 85 text

> [].slice.call(""["constructor"]+[]).filter(isNaN) ["f","u","n","c","t","i","o","n","S","t","r", /* ... */] "S"

Slide 86

Slide 86 text

> [].slice.call(""["constructor"]+[]) .filter(Function("return isNaN")()) ["f","u","n","c","t","i","o","n","S","t","r", /* ... */] "S"

Slide 87

Slide 87 text

> [].slice.call(""["constructor"]+[]) .filter(Array.constructor("return isNaN")()) ["f","u","n","c","t","i","o","n","S","t","r", /* ... */] "S"

Slide 88

Slide 88 text

> [].slice.call(""["constructor"]+[]) .filter([].constructor.constructor("return isNaN")()) ["f","u","n","c","t","i","o","n","S","t","r", /* ... */] "S"

Slide 89

Slide 89 text

> [].slice.call(""["constructor"]+[]) .filter([].constructor.constructor("return isNaN")())[8] "S" "S"

Slide 90

Slide 90 text

> (9).toString() "9" > (15).toString(16) "f" > (16).toString(17) "g" "p"

Slide 91

Slide 91 text

> (25).toString(26) "p" "p"

Slide 92

Slide 92 text

> (25)["toString"](26) "p" "p"

Slide 93

Slide 93 text

> escape(" ") "%20" "%"

Slide 94

Slide 94 text

> Function("return escape")()(" ") "%20" "%"

Slide 95

Slide 95 text

> Function("return escape")()(" ")[0] "%" "%"

Slide 96

Slide 96 text

> Function("return unescape")()("%3b") ";" Any ASCII character

Slide 97

Slide 97 text

> (({}+[])[!![]+!![]+!![]]+[]+(![]+[])[+!![]]+(+(!![]+!![]+!![]+[]+ (+!![])))[(!![]+[])[+![]]+[]+({}+[])[+!![]]+[][(![]+[])[!![]+!![] +!![]]+[]+(![]+[])[!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!! []]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]] [({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+(![]+[])[+!![]]+(![]+[])[!![] +!![]]+(![]+[])[!![]+!![]]](+[![]]+[]+(!![]+[])[({}+[])[!![]+!![] +!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!! []+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+ ({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+ (!![]+[])[+!![]]])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!! []+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!! []]+(!![]+[])[+!![]]]([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+ [])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[]) [+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![] +!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+ [])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]] +(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]] +[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+ [])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!! []+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][!

Slide 98

Slide 98 text

[]]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]] +[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]])) ())[+(+!![]+[]+(+!![]))]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+ [])[!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]+[][(![]+[])[!![] +!![]+!![]]+[]+(![]+[])[!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![] +!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]] [({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+(![]+[])[+!![]]+(![]+[])[!![] +!![]]+(![]+[])[!![]+!![]]]((!![]+[])[({}+[])[!![]+!![]+!![]+!![] +!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!! []]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!! []+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[]) [+!![]]]+[])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!![]+!! []]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!![]]+ (!![]+[])[+!![]]]([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[]) [+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+! []]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![] +!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+[])[!! []+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+ [])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[]) [+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[]) [+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!![

Slide 99

Slide 99 text

]+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][! []]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]] +[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]])) ())[+(+!![]+[]+(!![]+!![]+!![]))]](+(!![]+!![]+!![]+[]+(!![]+!! [])))+(![]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!! []+!![]+!![]]+(!![]+[])[+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!! []]+(+(!![]+!![]+[]+(!![]+!![]+!![]+!![]+!![])))[(!![]+[])[+![]]+[] +({}+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+[])[!![]+!![]]+ ([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![] +!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]] +[]+(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]](+[![]] +[]+(!![]+[])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+ ([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+ [])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!! []+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]])[(![]+[])[+![]]+[]+ ([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+ [])[+![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]([][({}+[])[!! []+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+ [])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[]) [+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[]) [+!![]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+

Slide 100

Slide 100 text

[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[]) [+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![] +!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+ [])[+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+ [])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+!![]]+({}+[])[!![]+!![]+!! []+!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![] +[])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+(+!![]))]+(!![]+[])[+! []]+(!![]+[])[+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+([][! []]+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+[])[!![]+!![]]+ ([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![] +!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]] +[]+(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]((!![]+ [])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+ [])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!! []]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[]) [+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]]+[])[(![]+[])[+![]]+[]+([][! []]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+! []]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]]([][({}+[])[!![]+!! []+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[]) [!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+! []]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!!

Slide 101

Slide 101 text

[]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[]) [+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+! []]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![] +!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[]) [+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+[]) [+![]]+(!![]+[])[+!![]]+([][![]]+[])[+!![]]+({}+[])[!![]+!![]+!![] +!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+ [])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+(!![]+!![]+!![]))]](+ (!![]+!![]+!![]+[]+(+![])))+(!![]+[])[+![]]) "javascript"

Slide 102

Slide 102 text

(({}+[])[!![]+!![]+!![]]+[]+(![]+[])[+!![]]+(+(!![]+!![]+!![]+[]+(+!![])))[(!![]+[])[+![]]+[]+({}+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+ [])[!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!! []]+[]+(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]](+[![]]+[]+(!![]+[])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+ [])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[]) [+!![]]+(!![]+[])[+!![]]])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!![]]+ (!![]+[])[+!![]]]([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!! []]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+ [])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![] +[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][! []]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+ (+!![]))]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+[])[!![] +!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+(! []+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]((!![]+[])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[]) [!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!! []]]+[])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]] ([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[]) [+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][! []]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+ [])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+!![]]+ ({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+(!![]+!![]+!! []))]](+(!![]+!![]+!![]+[]+(!![]+!![])))+(![]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]+([][![]]+[]) [!![]+!![]+!![]+!![]+!![]]+(+(!![]+!![]+[]+(!![]+!![]+!![]+!![]+!![])))[(!![]+[])[+![]]+[]+({}+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+[]) [!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+ []+(![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]](+[![]]+[]+(!![]+[])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[]) [+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!! []]+(!![]+[])[+!![]]])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!![]]+(!![] +[])[+!![]]]([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+ ([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[]) [+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+ [])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][! []]+[])[+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+ (+!![]))]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]+[][(![]+[])[!![]+!![]+!![]]+[]+(![]+[])[!![] +!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[!![]+!![]+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+(! []+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]]]((!![]+[])[({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[]) [!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!! []]]+[])[(![]+[])[+![]]+[]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+!![]]] ([][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][![]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[]) [+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+[])[+!![]]+(!![]+[])[+!![]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+[]+({}+[])[+!![]]+([][! []]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+![]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+![]]+({}+ [])[+!![]]+(!![]+[])[+!![]]]((!![]+[])[+!![]]+[]+(!![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][![]]+[])[+![]]+(!![]+[])[+!![]]+([][![]]+[])[+!![]]+ ({}+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(+[![]]))())[+(+!![]+[]+(!![]+!![]+!! []))]](+(!![]+!![]+!![]+[]+(+![])))+(!![]+[])[+![]])

Slide 103

Slide 103 text

No content