From 78090b815d042328489c95d1f1e978a400f0c5bb Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Tue, 30 May 2017 10:53:52 -0400 Subject: [PATCH 001/120] make voters give at least 1 each of max and min rating. Add STAR and begin to add 321. Broken. --- play/js/Ballot.js | 27 ++++++- play/js/Election.js | 69 +++++++++++++++++- play/js/Voters.js | 157 ++++++++++++++++++++++++++++++++++++---- play/js/main_sandbox.js | 14 ++-- 4 files changed, 244 insertions(+), 23 deletions(-) diff --git a/play/js/Ballot.js b/play/js/Ballot.js index 4f9070e8..8eac4449 100644 --- a/play/js/Ballot.js +++ b/play/js/Ballot.js @@ -20,6 +20,31 @@ function ScoreBallot(config){ hexagon: self.createRate(133, 184, 1) }; + // On update... + self.update = function(ballot){ + console.log(ballot) + for(var cID in ballot){ + var score = ballot[cID]; + self.boxes[cID].gotoFrame(score-1); + } + }; + +} + +function ThreeBallot(config){ + + var self = this; + config = config || {}; + config.bg = "img/ballot_range.png"; + Ballot.call(self, config); + + // BOXES! + self.boxes = { + square: self.createRate(133, 100, 0), + triangle: self.createRate(133, 143, 3), + hexagon: self.createRate(133, 184, 1) + }; + // On update... self.update = function(ballot){ for(var cID in ballot){ @@ -165,4 +190,4 @@ function Ballot(config){ }); }; -} \ No newline at end of file +} diff --git a/play/js/Election.js b/play/js/Election.js index 99661f3e..8fa9732c 100644 --- a/play/js/Election.js +++ b/play/js/Election.js @@ -48,6 +48,69 @@ Election.score = function(model, options){ }; +Election.star = function(model, options){ + + // Tally the approvals & get winner! + var tally = _tally(model, function(tally, ballot){ + for(var candidate in ballot){ + tally[candidate] += ballot[candidate]; + } + }); + for(var candidate in tally){ + tally[candidate] /= model.getTotalVoters(); + } + var frontrunners = []; + + for (var i in tally) { + frontrunners.push(i); + } + frontrunners.sort(function(a,b){return tally[a]-tally[b]}) + + var aWins = 0; + var bWins = 0; + for(var k=0; kballot[frontrunners[1]]){ + aWins++; // a wins! + } else if(ballot[frontrunners[0]] aWins) { + tally[frontrunner[1]] = tally[frontrunner[0]] + 0.5 + } + var winner = _countWinner(tally); + var color = _colorWinner(model, winner); + + // NO WINNER?! OR TIE?!?! + if(!winner){ + + var text = "NOBODY WINS"; + model.caption.innerHTML = text; + + }else{ + + // Caption + var text = ""; + text += ""; + text += "pairwise winner of two highest average scores wins
"; + for(var i=0; i"; + } + text += "
"; + text += _icon(frontrunners[0])+" and "+_icon(frontrunners[1]) +" have the highest score, and...
"; + text += "...their pairwise counts are "+aWins+" to "+bWins+", so...
"; + text += "
"; + text += "
"; + text += ""+winner.toUpperCase()+" WINS"; + model.caption.innerHTML = text; + + } + +}; + Election.approval = function(model, options){ // Tally the approvals & get winner! @@ -266,7 +329,7 @@ Election.irv = function(model, options){ // And repeat! roundNum++; - + } // END! @@ -328,7 +391,7 @@ var _tally = function(model, tallyFunc){ for(var i=0; i maxdist) { + maxdist = dist; + maxi = c.id + } } - + + scores[maxi] = 0 + scores[mini] = 5 // Scooooooore return scores; @@ -81,6 +96,103 @@ function ScoreVoter(model){ } +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function ThreeVoter(model){ + + var self = this; + self.model = model; + + self.radiusStep = window.HACK_BIG_RANGE ? 61 : 25; // step: x<25, 25 maxdist) { + maxdist = dist; + maxi = c.id + } + } + + scores[maxi] = 0 + scores[mini] = 2 + + // Scooooooore + return scores; + + }; + + self.drawBG = function(ctx, x, y, ballot){ + + // RETINA + x = x*2; + y = y*2; + + // Draw big ol' circles. + for(var i=1;i<5;i++){ + ctx.beginPath(); + ctx.arc(x, y, (self.radiusStep*i)*2, 0, Math.TAU, false); + ctx.lineWidth = (5-i)*2; + ctx.strokeStyle = "#888"; + ctx.stroke(); + } + + }; + + self.drawCircle = function(ctx, x, y, size, ballot){ + + // There are #Candidates*5 slices + // Fill 'em in in order -- and the rest is gray. + var totalSlices = self.model.candidates.length*2; + var leftover = totalSlices; + var slices = []; + for(var i=0; i maxdist) { + maxdist = dist; + maxi = approved.length - 1 + } + } + + if(mindist>=self.approvalRadius){ + approved.push(mini); } - + if(maxdist Date: Wed, 31 May 2017 08:27:31 -0400 Subject: [PATCH 002/120] fix sandbox --- play/js/main_sandbox.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 209b6908..ea7f1d17 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -162,8 +162,8 @@ function main(config){ {name:"Borda", voter:RankedVoter, election:Election.borda, margin:4}, {name:"Condorcet", voter:RankedVoter, election:Election.condorcet}, {name:"Approval", voter:ApprovalVoter, election:Election.approval, margin:4}, - {name:"Score", voter:ScoreVoter, election:Election.score} - {name:"STAR", voter:ScoreVoter, election:Election.STAR} + {name:"Score", voter:ScoreVoter, election:Election.score}, + {name:"STAR", voter:ScoreVoter, election:Election.star, margin:4}, {name:"3-2-1", voter:ThreeVoter, election:Election.score} ]; var onChooseSystem = function(data){ From a781d172ef8fb71a2df33ad04443f0a137a932bc Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Wed, 31 May 2017 08:31:29 -0400 Subject: [PATCH 003/120] fix mindist --- play/js/Voters.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/play/js/Voters.js b/play/js/Voters.js index 988a46f5..a16ffe85 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -23,8 +23,8 @@ function ScoreVoter(model){ // Scores for each one! var scores = {}; - var mindist = 99; - var maxdist = -99; + var mindist = 9999; + var maxdist = -9999; var mini = null; var maxi = null; for(var i=0; i Date: Wed, 31 May 2017 09:47:35 -0400 Subject: [PATCH 004/120] OK, star and 321 both work now. --- play/js/Election.js | 101 ++++++++++++++++++++++++++++++++++++++-- play/js/Voters.js | 15 ++---- play/js/main_sandbox.js | 2 +- 3 files changed, 103 insertions(+), 15 deletions(-) diff --git a/play/js/Election.js b/play/js/Election.js index 8fa9732c..b936e056 100644 --- a/play/js/Election.js +++ b/play/js/Election.js @@ -56,7 +56,7 @@ Election.star = function(model, options){ tally[candidate] += ballot[candidate]; } }); - for(var candidate in tally){ + for(var candidate in model.candidatesById){ tally[candidate] /= model.getTotalVoters(); } var frontrunners = []; @@ -64,8 +64,9 @@ Election.star = function(model, options){ for (var i in tally) { frontrunners.push(i); } - frontrunners.sort(function(a,b){return tally[a]-tally[b]}) + frontrunners.sort(function(a,b){return tally[b]-tally[a]}) + var ballots = model.getBallots(); var aWins = 0; var bWins = 0; for(var k=0; k aWins) { - tally[frontrunner[1]] = tally[frontrunner[0]] + 0.5 + winner = frontrunners[1] } - var winner = _countWinner(tally); var color = _colorWinner(model, winner); // NO WINNER?! OR TIE?!?! @@ -111,6 +112,74 @@ Election.star = function(model, options){ }; +Election.three21 = function(model, options){ + + var ballots = model.getBallots(); + // Tally the approvals & get winner! + var tallies = _tallies(model, 3); + + var semifinalists = []; + + for (var i in model.candidatesById) { + semifinalists.push(i); + } + semifinalists.sort(function(a,b){return tallies[2][b]-tallies[2][a]}) + + var finalists = semifinalists.slice(0,3); + finalists.sort(function(a,b){return tallies[0][a]-tallies[0][b]}) + + var ballots = model.getBallots(); + var aWins = 0; + var bWins = 0; + for(var k=0; kballot[finalists[1]]){ + aWins++; // a wins! + } else if(ballot[finalists[0]] aWins) { + winner = finalists[1] + } + var color = _colorWinner(model, winner); + + // NO WINNER?! OR TIE?!?! + if(!winner){ + + var text = "NOBODY WINS"; + model.caption.innerHTML = text; + + }else{ + + // Caption + var text = ""; + text += ""; + text += "Semifinalists: 3 most good. Finalists: 2 least bad. Winner: more preferred.
"; + text += "Semifinalists:
"; + for(var i=0; i"; + } + text += "Finalists:
"; + for(var i=0; i"; + } + text += "Winner:
"; + + text += _icon(finalists[0])+": "+aWins+"; "+_icon(finalists[1]) +": "+bWins+", so...
"; + text += "
"; + text += "
"; + text += ""+winner.toUpperCase()+" WINS"; + model.caption.innerHTML = text; + + } + +}; + Election.approval = function(model, options){ // Tally the approvals & get winner! @@ -397,6 +466,30 @@ var _tally = function(model, tallyFunc){ } +var _tallies = function(model, levels){ + + // Create the tally + var tallies = []; + for (var level=0; level maxdist) { + if (dist > maxdist) { maxdist = dist; maxi = c.id } @@ -174,7 +169,7 @@ function ThreeVoter(model){ for(var i=0; i Date: Wed, 31 May 2017 09:52:06 -0400 Subject: [PATCH 005/120] "system"->"method"; and Trudeau backed off. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “Voting system” is ambiguous; could refer to machines. “Method” is clearer. --- index.html | 106 ++++++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/index.html b/index.html index ac47b12a..b28cfb3a 100644 --- a/index.html +++ b/index.html @@ -11,14 +11,14 @@ - + - + @@ -27,7 +27,7 @@ - + @@ -36,7 +36,7 @@ -
- +
“BUT WHAT CAN I DO?”
- +

For citizens: Remember, think global, but act local. Change from the bottom-up lasts longer. @@ -612,7 +612,7 @@

SANDBOX MODE! find your Member of Parliament and badger 'em. Also if you're Canadian, - fill out the MyDemocracy.ca survey before the end of 2016! + fill out the MyDemocracy.ca survey before the end of 2016! This survey has a few questions specifically about voting reform! (sadly, the question is still framed as "simple vs expressive". that is why i've been so gung-ho about Approval & Score, @@ -648,7 +648,7 @@

SANDBOX MODE! Electology likes Approval Voting most, FairVote likes Instant Runoff most, @@ -683,7 +683,7 @@

SANDBOX MODE!

@@ -698,9 +698,9 @@

SANDBOX MODE! SANDBOX MODE! SANDBOX MODE! sharing is caring! From 6c5eac0239eea426a1d0c3c3a37e5fc66f3448e8 Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Mon, 3 Jul 2017 09:48:00 -0400 Subject: [PATCH 006/120] draft rewriting --- img/logo.png | Bin 48531 -> 100103 bytes index.html | 8 +- newer.html | 1145 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1149 insertions(+), 4 deletions(-) create mode 100644 newer.html diff --git a/img/logo.png b/img/logo.png index 221366607afb2559b32827db29cd975ee50017a5..4038edbc32db404104c1f865f8814efc21cb0b1d 100644 GIT binary patch literal 100103 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 z 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 l_7VC+$LM4(sP&~JNHFoueV_k14F4VsBvOu8Ky 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 literal 48531 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 UpZnJVJ?Kl66x8LBk1SsOKir!G+yDRo diff --git a/index.html b/index.html index b28cfb3a..9b22fa03 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - To Build a Better Ballot + To Build a ...Better Ballot @@ -11,14 +11,14 @@ - + - + @@ -27,7 +27,7 @@ - + diff --git a/newer.html b/newer.html new file mode 100644 index 00000000..ea4bb581 --- /dev/null +++ b/newer.html @@ -0,0 +1,1145 @@ + + + + + + To Build an Even Better Ballot? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ + + +
+ +

You read/played Nicky Case's great explainer on voting methods. And you still want more!

+ +

Never fear. I have two more voting methods to teach you about, and I hope I can convince you that they're the best yet.

+ +

Who's "me"? I'm Jameson Quinn, a statistics student at Harvard and a board member of the Center for Election Science. I'm not as good a designer or interactive programmer + as Nicky, as you can see from the title above. But I have spent a lot of time thinking about voting methods.

+ +

I'm also not as cool as Nicky, but I'm going to pretend to be. If my pale imitation of their chatty tone puts you off, then... well, I guess you can wait for my peer-reviewed paper.

+ +

So, the story so far: FPTP voting is horrible. There's all kinds of other voting methods that would be better. We're looking for the one that's best. Some activists think that's Instant Runoff Voting (IRV), but Nicky and I both disagree; it can prematurely eliminate centrists, and requires centralized counting. Nicky says they lean towards score voting, and I can see why: it's easy to understand, and in all the simulations Nicky built, it does a great job of satisfying all the little dot-on-screen voters.

+ +

By the end of this interactive, you're going to understand the three methods I consider the best. One of them Nicky already showed you: approval voting, which is great because it's so simple and because it has absolutely no downsides versus FPTP. The other two are newer, but they use similar basic ideas to what you've already seen. I hope you like all three methods.

+ +

But before I show you the new methods, I have to show you why score voting isn't already the greatest method possible. So I have to explain strategic voting.

+ +

Unstrategic voting

+ +

Remember how Nicky's voters worked in Score Voting? They just gave each candidate a number based on the absolute distance. Like this:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

But notice something about that ballot? For many positions of the voter and candidate, the ballot doesn't include a score of 5 or a score of 0. If you actually voted like that, you'd be giving up on some of your voting power. Say Triangle is your favorite, and you give them a score of 3, which also happens to be their average score. If Square wins with a score of 3.2, you're going to feel very silly for not giving a triangle a 5, in order to pull their average up as high as you can.

+ +

Digression: median systems

+ + skip this digression + +

Ever watched the Olympics? In events like figure skating, there are a number of Olympic judges from different countries. In order to prevent any one judge from having too much influence, they use a "trimmed mean": they throw away the highest and lowest scores before they take the average.

+ +

Olympic judges are supposedly supposed to be unbiased. But for voters, there's nothing wrong with having political opinions. (I mean, obviously your opinions, dear reader, are the best, and everybody else should just listen to you. But much as I'd like to, I can't force them to.) So let's imagine voting used the olympic system.

+ +

Throwing away just one highest and lowest score, with thousands or millions of voters, obviously wouldn't make an appreciable difference. So we'd have to throw away some more scores. And, why not? Let's throw away a few more while we're at it.

+ +

When should we stop? When there's just 1 or 2 scores left to take the average. But if you do that, most people wouldn't called that a "trimmed mean" anymore; they'd just call it the median, the middle number.

+ +

There are several voting methods that use the median to find the winner. (It turns out that can lead to a lot of ties, so you need a tiebreaker system to avoid that.) In the 1910s, over a dozen US cities, starting with Grand Junction, CO, used "Bucklin voting", a median-based system using a hybrid ranked/rated ballot. More recently, voting theorists Balinski and Laraki have proposed Majority Judgment, a median-based method using a rated ballot that's now been used in a number of competitions.

+ +

Using the median reduces the incentives for a single voter to strategize. After all, unless you happen to be the exact median rating for a candidate, the only thing that matters about the rating you gave them is whether it's above or below the median.

+ +

Still, large groups of voters can still get a strategic advantage. The larger the voting bloc, the greater the chance is that the median rating for a given candidate happens to be a voter in that bloc.

+ +

I used to think that median voting methods were the best. But then I did the simulations I'll talk about below, and they were merely OK; not much better outcomes than approval voting, but without the simplicity. I still think they're hugely better than FPTP and a bit better than IRV, but I'm not sold enough on them for it to be worth my time programming them in to Nicky's simulator.

+ +

Lightly-strategic voting: "normalization"

+ +

As I suggested above, in the real world, in score voting and similar methods, most voters will want to make sure that their ballot contains at least one candidate each at the top rating and at the bottom rating. The simplest way to do that (even though the name sounds complicated and math-y) is "normalization". That just means that you set the top and bottom ratings to be however good your favorite and least-favorite candidates are, and then spread the rest of the ratings evenly between that.

+ +

Here's an example of a "normalizing" voter for you to play with:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try removing the pentagon candidate, and see what happens.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that triangle and square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

+ + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

Just as normalized voters can have more voting power than naive voters, strongly strategic voters can have more than normalized voters (as long as they are not too far off in guessing the frontrunners). This is a potential weakness of score voting.

+ +

Is approval voting immune to this kind of voting strategy? No; in fact, in the early seventies, mathematicians Gibbard and Satterthwaite both independently proved the theorem which bears their names, showing that no non-dictatorial voting method with more than 2 options is entirely immune to strategy. Unlike Arrow's theorem, which Nicky discussed, this one goes for any kind of voting method — ranked, rated, or whatever. So yes, approval voting is more resistant to strategy than score; but not immune.

+ +

(Note: advocates for IRV sometimes garble this point by saying that in approval voting the best strategy is to "bullet vote" for only your favorite candidate, and that this would lead it to devolve back to FPTP. That's just wrong; if voters are strategically voting for somebody other than their favorite in FPTP, then there's no way it would make sense for them to bullet vote in approval. Approval voting isn't perfect, but it simply does not break down to FPTP.)

+ +

One scenario where approval becomes a factor is called the "chicken dilemma". Imagine 3 groups of voters, with 25%, 30%, and 45% of the vote respectively. Say that the first two groups both prefer each other over the third, so that either of them could beat that third opponent by 55% to 45%. Whichever of the first two groups strategically gives fewer approvals to its rival will win... unless neither of them gives enough, in which case the opponent will win. This is called a "chicken dilemma" because it's like a game of chicken between the voters for the two similar rivals: they can "swerve" and let their second-favorite win, or they can "drive straight" and either win (if the other side swerves) or crash (if the other side doesn't).

+ +

Here's that scenario in sandbox form. The slider on the right controls the percent of the smallest group that is strongly strategic between triangle and square; all the rest of the voters use normalized strategy (that is, approve any candidate better than the average of their favorite and least-favorite).

+ + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ + +

The "chicken dilemma" is a genuinely tough situation for almost any voting method. The motivations for the two rival factions to vote strategically are hard to minimize safely. Voting methods that go too far out of their way to punish strategic voters in this scenario tend to get the wrong answer in other, more-common scenarios like center squeeze. Look at how these various methods deal with both of these situations:

+ + + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

So, now I've explained why strategic voting makes things tricky, I can explain my two favorite voting methods: star voting and 3-2-1 voting.

+ +

Star voting

+ +

"Star", or more precisely, "s+ar", stands for "score plus automatic runoff." In this method, voters use the same ballot as score voting. Between the two candidates with the highest scores, the winner is the one that comes higher on more ballots. Here's a one-voter star election. You can choose between three kinds of strategy: normalized, moderately strategic, and strongly strategic. The first and last kinds you've seen before. The third is almost like a strongly strategic voter, except that the ratings may be changed by one to avoid giving a frontrunner the same score as any other candidate. Here's a one-voter election:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

And here's the chicken dilemma you saw above:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

3-2-1 voting

+ +

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ + + + + +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ + + + +
+
+ +

+ click & drag
the candidates and the voter:
+

+ + +
+
+ +

It's a tough choice. Triangle's got some sharp points, but Square understands more sides! Alas, in the end, you can only vote for one.

+ +

Of course, there's more than just one voter in an election. Let's simulate what an election would look like with 100+ voters.

+ +
+
+ +

+ drag the candidates & voters around.
(to move voters, drag the middle of the crowd)
watch how that changes the election:
+

+ + +
+
+ +

Now let's consider a different election. Say Tracy Triangle is already beating Steven Square in the polls, and a third candidate, Henry Hexagon , sees this. (Hexagon's supporters like how he tackles problems from more angles) Inspired by her success, Hexagon swoops in and takes a political position close to Triangle's.

+ +

Now, you'd think giving the voters more of what they want should result in a better choice, or at least, not result in a worse choice, right? Well...

+ +
+
+ +

+ + at first, beats .
+ drag to just under ,
+ and see what happens:
+

+ + +
+
+ +

That's right. Steven Square, our least popular candidate, now wins! This is because when you have two good candidates, they "steal" votes from each other, letting a bad third candidate win.

+ +

This is called the spoiler effect. The most famous real-world example of this was in 2000, when Ralph Nader "stole" votes from Al Gore, letting George Bush win. And though the spoiler effect didn't play a big role in 2016, its impact could still be felt.

+ +

In the Republican primary, one anti-establishment nominee, Trump, ran against sixteen GOP establishment nominees, who all "stole" votes from each other, letting Trump grab the nomination, easily. As for the Democratic primary, fear of splitting the vote prevented Sanders from running as independent. And to cap it all off, there was always the worry that other candidates like Johnson, Stein, and McMullin could spoil the election.

+ +

But again, this is not about the 2016 U.S. election.

+ +

This is about designing a democracy that people can trust.

+ +

Despite so much hoopla around the 2016 election, a full half of Americans did not vote. Even of those who voted for Clinton/Trump, 20% of them said their candidates were untrustworthy, and voted for them anyway. And around the world, people's trust in their governments – or the trustworthiness of their governments – has never been lower. It's more than America at stake. It's every democracy in the world.

+ +

...so yeah, no pressure.

+ +

Rebuilding trust is a complex problem with no easy solutions. But I think there is an easy first step. It's a step that could get rid of our “lesser of two evils” problem, and give us citizens more choices, better choices. And yet, it won't be as daunting as fixing campaign finance or gerrymandering or lack of proportional representation, no, it'd just require changing a piece of paper, and how we count those pieces of paper.

+ +

This idea is not the most important issue. It won't solve everything. But as a first step? It'd give us the biggest bang-for-buck.

+ +

Let's talk about how to build a better ballot.

+ +
+ + + + +
+ +

Now, some of you may have a couple objections!

+ +

First objection. Why would the people in power change the voting method that got them in power? Well, the spoiler effect has cost both Dems & Reps a major election before. Getting rid of that glitch would be a win-win for major and minor parties! Also, voting reform is already picking up steam. Just last month, Maine adopted Instant Runoff, and Justin Trudeau, Canada's Cutie-In-ChiefCynic-in-Chief, will be moving his nation towards a better voting system in 2017. (UPDATE: actually, he didn't do that.)

+ +

Second objection. Didn't some guy once prove that all voting methods will be unfair? Not quite. You're thinking of the infamous Impossibility Theorem by Kenneth Arrow, the mathematician in the 1950's who founded the whole study of voting methods.

+ +

Two answers to that: 1) some voting methods can still be more fair than others, even if none are perfect. And 2) Kenneth Arrow's proof doesn't apply to all voting methods! That's a misconception. It only applies to voting methods where you rank candidates. Later, we'll see some voting methods where you don't rank candidates – along with other alternatives to our current, glitchy voting method.

+ +

But first, let's take a closer look at the voting method we do have:

+ +
+
+ +

FIRST PAST THE POST (FPTP)

+

same as before. click & drag
the candidates and voter

+ + +
+
+ +

How To Count: Simply add up the votes. Whoever gets the most votes, wins.

+ +

Sounds logical enough. But as you saw earlier, it can lead to a weird glitch, where having two good candidates can make the election go to a third bad candidate. This is why some people vote "strategically", voting not for their actual honest favorite, but voting for the lesser of two evils. And strategic voting is fine – but! – ask yourself this: how can we expect our elected officials to be honest, when our voting method itself doesn't let us be honest?

+ +

So, to fix the spoiler effect, other voting methods have been suggested. Such as...

+
+
+ +

RANKED VOTING

+

again, click & drag

+ + + +
+
+ +

How To Count: There's actually several different ways to count these kinds of ballots. Here, I'll just show you the top three:

+ +

+ Instant Runoff Voting (IRV): + This one is the most popular alternative to First Past The Post (FPTP). + Australia and Ireland use it in national elections. + San Francisco, Minneapolis, and Portland, Maine use it in local elections. + And Justin Trudeau, Prime Man-ister of Canada, + is leaning towards Instant Runoff, too. +

+ +

+ (Note: Instant Runoff Voting is also called “Ranked Choice Voting”, + even though there's other ways to count ranked ballots. + IRV is also often just called “Alternative Vote”, + even though there's a flippin' dozen other voting methods. + Such selfish naming! Sheesh!) +

+ +

IRV is a bit more complicated than FPTP, but here's how it works:

+ +
    +
  1. Count up the #1 choices.
  2. +
  3. If someone has more than 50%, they win! END.
  4. +
  5. If not, eliminate the last-place loser.
  6. +
  7. Run a new "round" of the election, minus that loser.
  8. +
  9. Repeat until someone has 50% or more.
  10. +
+ +

If that seems like too much, there is a much simpler method of counting ranked ballots...

+ +

Borda Count: Simply add up the rank numbers. Like in golf, whoever has the lowest score, wins. Borda count is used in Slovenia and a bunch of tiny islands in Micronesia.

+ +

But if you want an even nerdier way of voting, you could try...

+ +

Condorcet Method: Run a simulated "election" between every pair of candidates, using the info on voters' ballots. IF there's a candidate who beats all other candidates in one-on-one "elections", that candidate wins the real election. However, that's a very big "IF". (as we'll see later...) The upside is, when this method does pick a winner, it's always the “theoretically best” candidate! Currently, this method is not being used by any governments, and is only being used by neeerrrrrds.

+ +

So, those are the voting methods where you rank candidates – the ones that Kenneth Arrow proved would always be unfair in some big way! But what of voting methods where you don't rank candidates? They're less well-known, but now, at least you'll know 'em:

+ +
+
+ +

APPROVAL VOTING

+

yup, stiiiiill click & drag

+ + + +
+
+ +

How To Count: Simply add up the approvals. Whoever gets the most approvals, wins.

+ +

Wait, picking more than one candidate? Doesn't that violate the one-vote-per-person rule? I hear you ask. Well, your vote was never a single check mark, your vote was always the whole ballot. And on this ballot, you get to honestly express all the candidates you approve of, not just your favorite or strategic second-favorite.

+ +

But if you want a more expressive voting method, why not try...

+ +
+
+ +

SCORE VOTING

+

you guessed it

+ + + +
+
+ +

How To Count: Simply add up the ratings. Whoever has the highest average score, wins. Kind of like Amazon reviews, but with democracy. (Note: this is not a ranking method, because two candidates can have the same score.)

+ +

So there's our top 6 voting methods: the one we use, and five popular alternatives. But how can we tell if these alternatives are actually better? What glitches might they have? And which voting method – if any – can we say is "the best"?

+ +

Like before, let's simulate 'em.

+ +
+ + + + +
+

Remember that simulation of the spoiler effect from earlier? Well, here it is again, but now you can switch between the six different voting methods! Here's the "spoiler effect" simulation again. See how different voting methods deal with potential spoilers:

+
+
+

+ drag to just under to create a spoiler effect.
+ then compare the 6 different voting methods: +
+ + (note: in the rare cases there's a tie, i just randomly pick a winner) + +

+ + +
+
+ +

As you could see, every voting method except First Past The Post is immune to the spoiler effect. So, that's it, right? Ding dong, the glitch is dead? Just pick any other alternative voting method and be done with it?

+ +

But, alas. In getting rid of one glitch, some of these alternative voting methods create other glitches – for some, the cure is even worse than the disease.

+ +

For example, here's a sim of Instant Runoff Voting. In the beginning, Tracy Triangle is already winning, and you're going to move the voters even closer to her. Obviously, if a candidate is already winning an election, and becomes even more popular, they should still win afterwards, right?

+ +

You can probably guess where this is going...

+
+
+ +

+ drag the voters slowly up towards : +

+ + + +
+
+ +

What happened? + Originally, is eliminated in the first round, so + + goes against a weaker , and wins. + But when you move the voters closer to , + the loser changes! + So now, is eliminated in the first round, + which means goes against a stronger , + and loses.

+ +

Under Instant Runoff, it's possible for a winning candidate to lose, by becoming more popular. What a glitch!

+ +

How often does this actually happen in real life? There's a couple confirmed examples, and mathematicians estimate this glitch would happen about 14.5% of the time. But sadly, we can't know for sure, because governments usually don't release enough info about the ballots to reconstruct an IRV election & double-check the results.

+ +

So, not only is Instant Runoff's glitch as undemocratic as First Past The Post's glitch, it's possibly worse – because while FPTP's counting method is simple and transparent, Instant Runoff is anything but. And a lack of transparency is an even deadlier sin nowadays, when our trust in government is already so low.

+ +

(But wait! We'll be talking about the risk of strategic voting later. + Can IRV can make a comeback? Stay tuned...)

+ +

So much for the most popular alternative. What about the second-most popular, Borda Count? In this next simulation, you move a losing candidate closer to another losing candidate. Under FPTP, the spoiler effect would split their votes, making both of them lose even more. But watch what happens under Borda Count instead...

+ +
+
+ +

+ drag to just slightly left of : +

+ + + +
+
+ +

Yup. Borda Count has a reverse spoiler effect. Instead of one good candidate hurting another good candidate by moving closer, with Borda Count, one bad candidate can help another bad candidate by moving closer.

+ +

Here's what happened: at first, some voters ranked + >>, + but when you moved closer to , + those voters then swung to ranking + >>, + hurting enough + to make her lose to .

+ +

Still, Borda's not the worst, and at least it's simpler and more transparent than Instant Runoff. But how does Condorcet Method compare? When Condorcet picks a winner, it's always the “theoretically best” winner – but that's when it picks a winner.

+ +

So far, I've just been simulating voters as a single group, with a center and some spread. But seeing how polarized politics is nowadays, one could imagine several groups of voters, with totally different centers. Now, Condorcet tries to pick the candidate who beats all other candidates in one-on-one races. But with polarized voters, you could end up with a Rock-Paper-Scissors-like loop, where a majority of voters prefer A to B, B to C, and C to A.

+ +

In certain situations, the other voting methods just had glitches. In Condorcet, the voting method crashes. Try it out for yourself:

+
+
+ +

+ create your own “condorcet cycle”!
+ move the voters in such a way that NOBODY wins: +

+ + + +
+
+ +

Now, in actual practice – not that any government actually uses this voting method – when Condorcet fails to find a winner, the election falls back to another method like Borda Count. But if you do that, it'll get the glitches of its backup method. So it goes.

+ +

First Past The Post. Instant Runoff. Borda Count. Condorcet Method. Those were all the voting methods that use ranking – the ones that our math boy, Kenneth Arrow, proved would always be unfair or glitchy in some big way. What about the voting methods that don't use ranking, like Approval & Score voting? Well...

+ +

...I couldn't come up with a simulation to show their flaws. Because, in theory, they don't have many big flaws.

+ +

+ But that's a really, really, really big “in theory!” + It may be that, in practice, strategic voters use Approval & Score Voting exactly like First Past The Post – + only approving or giving 5 stars to their top candidate, and disapproving or giving 1 star to all others, + even if they actually like the others. + (See FairVote's critique of Approval Voting, and defense of Instant Runoff) +

+ +

+ Then again, even if Approval & Score Voting disincentivize you from expressing an honest second choice, + FPTP and IRV punish you for expressing an honest first choice. + Besides, if Approval can be "gamed", then that goes double for IRV. + (See this mathematician's critique of FairVote's critique, and defense of Approval) + So, in the end... [confused shrugging sounds]

+ +

+ We're gonna need a hecka lot more simulations. +

+ +

+ So, below is a chart + (source), + showing the results of 2.2 million simulations. + A huge variety of scenarios were tested. All-honest voters. + All-strategic voters. Half-honest, half-strategic. + Voters who know each others' preferences. + Voters who don't know each others' preferences. + Voters who only sorta-know each others' preferences. + And so on. + You can tell that a real mathematician made this chart, + because it's makin' my eyes bleed: +

+ +

+ +

+ Each voting method's results is shown as an ugly-blue bar. + The further to the right a voting method is, the more it "maximizes happiness" for the voters. + The higher up a voting method is, the simpler it is. + And a bar's width shows the range of a voting method's performance, + given different ratios of honest-to-strategic voters. +

+ +

+ The first thing to note is that strategic voting makes voters less happy than honest voting + – in all voting methods! I was very surprised when I first learnt that. + (But it makes sense, if you think about, say, a crowded room full of people trying to talk. Any one person can be "strategic" by shouting over others, but if everybody is "strategic", nobody can hear anybody, and all you're left with is sore throats and sad peeps.)

+ +

The other thing to note is which voting methods make people the happiest. If you have mostly honest voters, Score Voting is best. (with Borda Count a close second) And if you have mostly strategic voters, then both Approval & Score Voting are best. (and with strategic voters, IRV does just as bad as FPTP)

+ +

However, those are still computer simulations. How would these different voting methods play out in real life? Well, we can't just get the DeLorean up to 88, go back in time before the 2016 election, change the voting method, and see what would happen...

+ +

...or can we?!

+ +

No, no we can't. But last month, researchers did something close enough. + A polling study asked 1,000+ U.S. registered voters to rank & rate the six presidential candidates, + to simulate who would've won the (popular) vote under different voting methods! + (But keep in mind that if we had a different voting method in the primaries, we'd have different candidates entirely. + So take this study with a pillar of salt.) + The results: under Instant Runoff, Condorcet, and Approval Voting, the winner would've been Hillary Clinton. But under Score Voting, the winner would've been Donald Trump. And under Borda Count, the winner would've been... uh... Gary Johnson? +

+ +

?????

+ +
+
+

+ a guesstimated model of the 2016 US election?...
+ + how Clinton wins IRV, + Trump wins Score, + and Johnson wins Borda?? + +

+ +
+
+ +

Anyway.

+ +

Before we wrap all this up – remember Kenneth Arrow? The infamous mathematician who founded the study of voting methods in the 1950's? Well, in an interview 60 years later, Kenneth Arrow had this to say, about which voting method he likes most now:

+ +

+ “Well, I’m a little inclined to think that score methods [like Approval & Score Voting] where you categorize in maybe three or four classes [so, giving a score out of 3 or 4, not 10 or 100] probably – in spite of what I said about manipulation [strategic voting] – is probably the best.”

+ +

That's as strong an endorsement as you'll ever squeeze out of a math-head.

+
+ + + + +
+ +

ahem

+ +

+ DEAR JUSTIN “TOTES ADORBZ” TRUDEAU
+ (and everyone else around the world pushing for voting reform) +

+ +

Thank you for taking this small but powerful first step! We've known for way too long that our current voting method – First Past The Post – forces voters to be dishonest, creates a polarizing "lesser of two evils" scenario, and screws over both major and minor candidates.

+ +

+ However, you're probably only considering Instant Runoff Voting. + Which, to be fair, is better than than First Past The Post, + and if it's a choice between just those two, definitely go for Instant Runoff. + But IRV still has a glitch as undemocratic as FPTP's – + and worse, in our age of distrust, Instant Runoff's lack of transparency may be deadly for democracy. + Yes, sure, IRV was the best voting method we could come up with... + in 1870. + And since then, IRV has dominated the conversation, + unwittingly framing the whole voting reform debate as “simple vs expressive”. +

+ +

+ But that is a false choice. Thanks to computer simulations, real-life studies, and a bunch of math nerds, + we now know of voting methods that are both simple and expressive. +

+ +

+ Personally, I'm leaning towards Score Voting. + It's simple, very expressive, and already familiar to anyone who's seen Amazon's or Yelp's “five star” review method. + But that's just my humble opinion. + You could also make the case that Approval Voting is more practical, + because it's even simpler, and would already work with existing voting machines! + All you'd need to do is change the instructions from + “vote for the candidate you like” to “vote for the candidates you like”. +

+ +

+ Or maybe I'm completely wrong about Instant Runoff Voting, and it's actually pretty okay. + Heck, you could even go for Borda Count, as a hilarious prank. +

+ +

I won't claim to know which voting method is The Best™. I shall keep open this discussion, just as long as we have this discussion. For three reasons:

+ +

1) If I claim one voting method is the best, end of story, all the social-choice-theory nerds will be on my butt, yelling, BUT NICKY WHAT ABOUT QUADRATIC VOTE BUYING

+ +

2) We still need to test these alternative voting methods with actual experience, + not just annoying internet flame wars between IRV advocates and Score Voting advocates theory. + All the more reason for small towns, local states, and nations like Canada to be pioneers, to bravely experiment!

+ +

3) Keeping the discussion going is what democracy is.

+ +

A recent study found that in many Western countries – from Sweden to Australia to the United States – support for democracy has plummeted over the last several generations. + In 2011, almost a full quarter of young Americans said democracy was a "bad" or "very bad" way to run a country. + And today, one in six Americans say it'd be "good" or "very good" to be under actual military rule. +

+ +

Our age of distrust goes a lot deeper than the technical details of a voting method. There isn't gonna be One Weird Trick to fix democracy. But as a first step, a low-hanging fruit, a way to show that, yes, you will make the method respond to the needs and wants and pains and hopes and dreams of your people – well, fixing our voting method's a good start as any.

+ +

Because, this isn't just about trying to build a better ballot.

+ +

This is about trying to build a better democracy.

+ +

<3,
+ ~ Nicky Case

+ +
+ +

P.S: Since you've read & played this all the way, here, have a bonus! + A “Sandbox Mode” of the election simulator, with up to five candidates. + You can also save & share your very own custom election scenario with others. Happy simulating!

+
+ + + + +
+
+

SANDBOX MODE! (link to just this)

+ +
+
+

+ One hope for Sandbox Mode is that readers can debate with me and each other using this tool! + Not just telling me I'm wrong, but showing me I'm wrong. + For example – + + here's a model I made in Sandbox Mode, + showing an interesting argument against Approval & Score Voting. + Granted, this tool is very limited – it doesn't handle strategic voting or imperfect information – + but I think it's a start, and may help improve our Democratic Discourse™ +

+
+
+ + + +
+
+ + +
+ +
+
PUBLIC DOMAIN
+ Zero rights reserved. + I'm giving away + all my art/code/words, + so that you + teachers, mathematicians, hobbyists, activists, and policy wonks + can use them however you like! + This is for you. + Get my source code on GitHub! +
+
+ +
+ + +
+ +
“BUT WHAT CAN I DO?”
+ +

+ For citizens: Remember, think global, but act local. + Change from the bottom-up lasts longer. + If you're in the US, + find your representative + and badger 'em. + If you're in Canada, + find your Member of Parliament + and badger 'em. + Also if you're Canadian, + fill out the MyDemocracy.ca survey before the end of 2016! + This survey has a few questions specifically about voting reform! + (sadly, the question is still framed as "simple vs expressive". + that is why i've been so gung-ho about Approval & Score, + and maybe a bit too mean towards IRV) +

+ +

+ For learners: + Watch CGP Grey's Politics in the Animal Kingdom series! + It's charming, and covers more ground than I did here – it explains + gerrymandering, proportional representation, and more. + Also, read Gaming The Vote by + William Poundstone. + It's a thrilling read, + with dramatic human stories of crooks & conmen trying to game our glitchy voting systems – + and sometimes, succeeding. +

+ +

+ For teachers: + This entire "explorable explanation" is public domain, copyright-free, + meaning you already have permission to use this freely in your classes! + You can even use the Sandbox Mode to create your own material, + or as a tool for students to make something on their own. +

+ +

+ For coders: + This is all open source! + So you can get my code on GitHub, and remix it to your heart's content. + (sorry in advance for my messy code) +

+ +

+ Check out these organizations: + Though they may differ on what voting method they like best, + they all have a common goal: to reform the one we have. + Electology likes Approval Voting most, + FairVote likes Instant Runoff most, + and RangeVoting.org likes Score Voting most. +

+ +
ON THE SHOULDERS OF GIANTS
+

+ This "explorable explanation" was directly inspired by these two projects: +

+ +

+ Voting Sim Visualization by Ka-Ping Yee (2005) + was a real eye-opener. + (hat tip to Bret Victor for sharing it with me!) + I've heard lots of written debate over FPTP vs IRV vs Condorcet vs Approval vs blah blah blah, + but I'd never seen their difference visualized so clearly! + It gave me instant insight. + And it actually changed my mind – I used to think IRV was pretty good, + but after seeing IRV's messiness (as shown above), I realized it's actually kinda stinky cheese. +

+

+ However, even this brilliant visualization was still too abstract. + And since it wasn't interactive, I couldn't test the many questions & scenarios that came to mind. + So that's why my second inspiration was... +

+ +

+ Up and Down the Ladder of Abstraction + by Bret Victor (2011). + It's one of the web's earliest "explorable explanations" (also a term Bret coined) + and it is gorgeous. + Obviously, I borrowed the format of mixing words & "games" to explain things, + but I also followed the formula of starting concrete – one voter – + then moving up to the more abstract – a whole election. +

+

+ + You can learn more about Explorable Explanations here. +

+

+ And last but not least, thank you to all the math & policy nerds + who spent way too much time thinking about all this. +

+ +
+ STAY IN TOUCH, MAYBE?
+

+ Every once in a while, I'll fall into an endless rabbithole – + like this one on voting methods – and slowly crawl my way out, bloodied and bruised, + with a new interactive thing for you! + If you wanna find out + when I finally get around to making new shtuff, you can... +

+ +

+ And if you wanna see more of my past projects, + check out my wobsite! +

+

+ See you again soon! Have a Happy New Year 2017, or try to, anyway. +

+ +
+ + +
+
A BIG THANKS TO ALL MY
+
SUPPORTERS
+ + + +
+
aimee jarboe
+
frank leon rose
+
jared cosulich
+
louis-jean teitelbaum
+
matt hughes
+
micah cowan
+
michael alan huff
+
natalie sun
+
noel lehmann
+
phil dougherty
+
tom cascio
+
tom knowles
+
+
+
+
+ Adam M. Smith
+ Alex Dytrych
+ Andrew
+ Andy
+ Artemiy Solopov
+ Aschelon
+ ben fei
+ Benjamin Riggs
+ Bob Wise
+ Brandon
+ Brent Werness
+ Brian Wu
+ Bruno Guerrero
+ Buster Benson
+ Casey Ross
+ Charlie McIlwain
+ Christopher
+ Colin
+ Colin
+ Cort Stratton
+ Craig Steele
+ Daniel Horowitz
+ Daniel Shiffman
+ Dave Tu
+ David Smit
+ Dylan Meconis
+ Fahrstuhl
+ Feiya Wang
+ Forrest Oliphant
+ Frank Leon Rose
+ Henry Reich
+ Iñaki
+ J. Hu
+ Jacob Christian Munch-Andersen
+ Jacques Frechet
+ James Hogan
+ Janusz Leidgens
+ John_Ca
+ Johnny Owens
+ Joseph Perry
+ Joshua Horowitz
+ Julia Karmo
+ Karen Cooper
+ Kat Suricata
+ Kate Fractal
+ Kathryn Long
+ Kevin
+ Kevin Wang
+
+
+ Klemen Slavic
+ kuerqing1024
+ Linda Booth Sweeney
+ Maic Lopez Saenz
+ Matt "Kupo" Roszak
+ Matt Warren
+ May-Li Khoe
+ Mekki MacAulay
+ Micah Cowan
+ Michael Duke
+ Michelle Brown
+ Michelle Kelly
+ Milan Pingel
+ Monika Denes
+ Mustafa Alic
+ Nick Schrag
+ Nikita
+ Noah Swartz
+ Pablo Lopez Soriano
+ Pat Mächler
+ Peter McEvoy
+ Philip Tibitoski
+ Piotr Migdal
+ Rachel Nabors
+ Raphael D'Amico
+ Richard Hackathorn
+ Rob Napier
+ Roland Tanglao
+ Ryan Barker
+ Sam Anderson
+ Sam Maynard
+ Samira Nedungadi
+ Sarah Barbour
+ sarah mathys
+ SB Sigma
+ Seanny123
+ Serguei Filimonov
+ Sigpipe
+ Sylvain Francis
+ Syria Carys Sirlay
+ T_Caramel
+ TisGood
+ Tony Onodi
+ Traci Lawson
+ Yona
+ Yu-Han Kuo
+ Zach Smith
+ Zoe Bogner +
+
+
+
AND SPECIAL THANKS TO
+
+
+ Alex Dytrych
+ Alex Jaffe
+ Brian Bucklew
+ Chris Walker
+ Christine Zhang
+ Dan Zajdband
+ Daniel Cook
+ Droqen
+ Jason Grinblat
+
+
+ Jessie Salz
+ Lisa Charlotte Rost
+ Martin Shelton
+ Patrick Dubroy
+ Pietro Passarelli
+ Sandhya Kambhampati
+ Tanya Short
+
+
+
+
+ +
+
+ sharing is caring! + +
+
+ +
+ + + + From 889881daf5129fa1c08c35e1cbbd54a25e9bfcbd Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Sun, 30 Jul 2017 14:00:57 -0700 Subject: [PATCH 007/120] describe what I'm imagining --- newer.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/newer.html b/newer.html index ea4bb581..2d23d004 100644 --- a/newer.html +++ b/newer.html @@ -79,6 +79,7 @@

Unstrategic voting

Remember how Nicky's voters worked in Score Voting? They just gave each candidate a number based on the absolute distance. Like this:

+
@@ -89,6 +90,7 @@

UNSTRATEGIC BALLOT

+

Description: this should just be an unstrategic score voter, as in ncase's thing. Allow ballot picture to show 0 scores.

But notice something about that ballot? For many positions of the voter and candidate, the ballot doesn't include a score of 5 or a score of 0. If you actually voted like that, you'd be giving up on some of your voting power. Say Triangle is your favorite, and you give them a score of 3, which also happens to be their average score. If Square wins with a score of 3.2, you're going to feel very silly for not giving a triangle a 5, in order to pull their average up as high as you can.

@@ -128,6 +130,7 @@

UNSTRATEGIC BALLOT

+

Description: this should be like ncase's "drag the voter" examples, with a normalizing score voter. This voter should have a series of circles, where the closest one intersects the closest candidate and the farthest one the farthest candidate. Thus, as you moved the voter or candidates the circles would change size.

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try removing the pentagon candidate, and see what happens.

@@ -141,6 +144,7 @@

UNSTRATEGIC BALLOT

+

This should be a score voting scenario with 100% normalizing voters. the voter median around (0,0), and candidates square (3,0), triangle (-2,0), pentagon (-4,0). Pentagon voters are not enthusiastic enough about triangle so square wins, even though triangle is higher utility. Removing penta fixes the problem.

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

@@ -154,6 +158,7 @@

UNSTRATEGIC BALLOT

+

groups of voters at (-4,0)non-normalizing and (4,0)normalizing. Cands at (-2.5,.5), (-2,0), (0,0), (2,0), (2.5,.5). (2,0) wins.

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that triangle and square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

@@ -169,6 +174,8 @@

UNSTRATEGIC BALLOT

+

Single-voter example with 3 candidates and a voter who normalizes based on only the 2 of them.

+

Just as normalized voters can have more voting power than naive voters, strongly strategic voters can have more than normalized voters (as long as they are not too far off in guessing the frontrunners). This is a potential weakness of score voting.

Is approval voting immune to this kind of voting strategy? No; in fact, in the early seventies, mathematicians Gibbard and Satterthwaite both independently proved the theorem which bears their names, showing that no non-dictatorial voting method with more than 2 options is entirely immune to strategy. Unlike Arrow's theorem, which Nicky discussed, this one goes for any kind of voting method — ranked, rated, or whatever. So yes, approval voting is more resistant to strategy than score; but not immune.

@@ -191,6 +198,8 @@

UNSTRATEGIC BALLOT

+

Clumps of voters at (x,y,size): (-2,1,6); (-2,-1,4)slider; (3,0,10).

+

The "chicken dilemma" is a genuinely tough situation for almost any voting method. The motivations for the two rival factions to vote strategically are hard to minimize safely. Voting methods that go too far out of their way to punish strategic voters in this scenario tend to get the wrong answer in other, more-common scenarios like center squeeze. Look at how these various methods deal with both of these situations:

@@ -207,6 +216,8 @@

UNSTRATEGIC BALLOT

+

two different sandboxes. One repeats chicken dilemma case from above but also lets you switch voting methods (plurality, IRV, approval, score). The other one has center squeeze.

+

So, now I've explained why strategic voting makes things tricky, I can explain my two favorite voting methods: star voting and 3-2-1 voting.

Star voting

From ceab5d9103b17d5159e840ff8cffa80ba613f61b Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Sun, 30 Jul 2017 14:04:13 -0700 Subject: [PATCH 008/120] more blurbs --- newer.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/newer.html b/newer.html index 2d23d004..39809c72 100644 --- a/newer.html +++ b/newer.html @@ -235,6 +235,8 @@

UNSTRATEGIC BALLOT

+

one-voter star election

+

And here's the chicken dilemma you saw above:

@@ -248,6 +250,8 @@

UNSTRATEGIC BALLOT

+

chicken dilemma with star

+

3-2-1 voting

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

@@ -263,6 +267,8 @@

UNSTRATEGIC BALLOT

+

one-voter 3-2-1

+

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

@@ -276,6 +282,8 @@

UNSTRATEGIC BALLOT

+

chicken dilemma with 3-2-1

+

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

From 284d6ebb493cc8cd62ad4f9489723505f8fdc02b Mon Sep 17 00:00:00 2001 From: Paretoman Date: Mon, 31 Jul 2017 12:37:29 -0400 Subject: [PATCH 009/120] wrote 2 more strategies. Maybe could do another. used 1 as lowest score for testing. need to change that back to 0. --- play/js/Voters.js | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/play/js/Voters.js b/play/js/Voters.js index a48ebd79..5115fc7a 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -22,16 +22,18 @@ function ScoreVoter(model){ self.getBallot = function(x, y){ // Scores for each one! - var scores = {}; + var scores = {}; var mindist = 9999; var maxdist = -9999; var mini = null; var maxi = null; + var dista = []; for(var i=0; i=d_threshold) ? 1 : 5} + var scores2 = dista.map(thresholdit); + var assignit = function(d,i) {scores[self.model.candidates[i].id] = d;} + scores2.map(assignit) + scores[mini] = 5; + + } // otherwise, there is no strategy self.strategy == "nope" + // Scooooooore return scores; From 456fb7277a43b20962175b942239d5059b8fe2e8 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Mon, 31 Jul 2017 13:54:27 -0400 Subject: [PATCH 010/120] connected config to strategy. --- play/ballot1.html | 2 +- play/ballot2.html | 2 +- play/ballot3.html | 2 +- play/ballot4.html | 2 +- play/ballot5.html | 26 ++++++++++++++++++++++++++ play/election6.html | 40 ++++++++++++++++++++++++++++++++++++++++ play/js/Voters.js | 21 ++++++++++----------- play/js/main_ballot.js | 6 +++++- play/js/main_sandbox.js | 3 +++ 9 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 play/ballot5.html create mode 100644 play/election6.html diff --git a/play/ballot1.html b/play/ballot1.html index 40870f1b..2f0036cc 100644 --- a/play/ballot1.html +++ b/play/ballot1.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot2.html b/play/ballot2.html index 4b55d793..5f9d2d6a 100644 --- a/play/ballot2.html +++ b/play/ballot2.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot3.html b/play/ballot3.html index d364230f..6366037f 100644 --- a/play/ballot3.html +++ b/play/ballot3.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot4.html b/play/ballot4.html index b7683b34..4271633b 100644 --- a/play/ballot4.html +++ b/play/ballot4.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot5.html b/play/ballot5.html new file mode 100644 index 00000000..c033c96a --- /dev/null +++ b/play/ballot5.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election6.html b/play/election6.html new file mode 100644 index 00000000..b925a119 --- /dev/null +++ b/play/election6.html @@ -0,0 +1,40 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/js/Voters.js b/play/js/Voters.js index 5115fc7a..da0c68cd 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -19,7 +19,7 @@ function ScoreVoter(model){ return 0; }; - self.getBallot = function(x, y){ + self.getBallot = function(x, y, strategy){ // Scores for each one! var scores = {}; @@ -44,12 +44,11 @@ function ScoreVoter(model){ maxi = c.id } } - self.strategy = "normalized" self.model.idlastwinner = "square" - if(self.strategy == "justfirstandlast") { + if(strategy == "justfirstandlast") { scores[maxi] = 1 scores[mini] = 5 - } else if (self.strategy == "normalized") { + } else if (strategy == "normalized") { var fnorm = 1/ (maxdist-mindist); if (1) { var normit = function(d) {return (d-mindist)*fnorm;} @@ -65,7 +64,7 @@ function ScoreVoter(model){ scores[self.model.candidates[i].id] = gs; } } - } else if (self.strategy == "threshold") { + } else if (strategy == "threshold") { var windex = 0; for(var i=0; i Date: Mon, 31 Jul 2017 14:11:13 -0400 Subject: [PATCH 011/120] spaces to tabs. --- newer.html | 2 +- play/js/Voters.js | 77 ++++++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/newer.html b/newer.html index ea4bb581..b496ef14 100644 --- a/newer.html +++ b/newer.html @@ -124,7 +124,7 @@

Lightly-strategic voting: "normalization"

UNSTRATEGIC BALLOT

Judge, don't choose.

- +
diff --git a/play/js/Voters.js b/play/js/Voters.js index da0c68cd..b56605c4 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -21,19 +21,20 @@ function ScoreVoter(model){ self.getBallot = function(x, y, strategy){ + // Scores for each one! - var scores = {}; + var scores = {}; var mindist = 9999; var maxdist = -9999; var mini = null; var maxi = null; - var dista = []; + var dista = []; for(var i=0; i=d_threshold) ? 1 : 5} - var scores2 = dista.map(thresholdit); - var assignit = function(d,i) {scores[self.model.candidates[i].id] = d;} - scores2.map(assignit) - scores[mini] = 5; - - } // otherwise, there is no strategy self.strategy == "nope" - + self.model.idlastwinner = "square" + if(strategy == "justfirstandlast") { + scores[maxi] = 1 + scores[mini] = 5 + } else if (strategy == "normalized") { + var fnorm = 1/ (maxdist-mindist); + if (1) { + var normit = function(d) {return (d-mindist)*fnorm;} + var ndist = dista.map(normit); + var gs = function(d) { return 1+Math.round(4*(1-d)); } + var gd = ndist.map(gs) + var assignit = function(d,i) {scores[self.model.candidates[i].id] = d;} + gd.map(assignit); + } else { // equivalent loop way of doing things + for(var i=0; i=d_threshold) ? 1 : 5} + var scores2 = dista.map(thresholdit); + var assignit = function(d,i) {scores[self.model.candidates[i].id] = d;} + scores2.map(assignit) + scores[mini] = 5; + + } // otherwise, there is no strategy self.strategy == "nope" + // Scooooooore return scores; From e52ce7dc5c891bdac448d7e69015094282cc4260 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Mon, 31 Jul 2017 15:49:22 -0400 Subject: [PATCH 012/120] different strategies for different voter groups. --- newer.html | 22 +++++++++++---------- play/election7.html | 42 +++++++++++++++++++++++++++++++++++++++++ play/election8.html | 41 ++++++++++++++++++++++++++++++++++++++++ play/js/main_sandbox.js | 8 +++++--- 4 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 play/election7.html create mode 100644 play/election8.html diff --git a/newer.html b/newer.html index b496ef14..115293ca 100644 --- a/newer.html +++ b/newer.html @@ -132,12 +132,13 @@

UNSTRATEGIC BALLOT

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try removing the pentagon candidate, and see what happens.

-
- -

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+
- +

+ non-optimal
+ try it +

+
@@ -145,12 +146,13 @@

UNSTRATEGIC BALLOT

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

-
- -

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+
- +

+ non-optimal
+ try it +

+
diff --git a/play/election7.html b/play/election7.html new file mode 100644 index 00000000..aa554bdf --- /dev/null +++ b/play/election7.html @@ -0,0 +1,42 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election8.html b/play/election8.html new file mode 100644 index 00000000..ca5f971b --- /dev/null +++ b/play/election8.html @@ -0,0 +1,41 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index a5bf09ac..e3db4072 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -44,7 +44,6 @@ function main(config){ // Defaults... config = config || {}; config.system = config.system || "FPTP"; - config.strategy = config.strategy || "nope"; config.candidates = config.candidates || 3; config.voters = config.voters || 1; config.features = config.features || 1; // 1-basic, 2-voters, 3-candidates, 4-save @@ -69,7 +68,6 @@ function main(config){ model.numOfCandidates = config.candidates; model.numOfVoters = config.voters; model.system = config.system; - model.strategy = config.strategy; var votingSystem = votingSystems.filter(function(system){ return(system.name==model.system); })[0]; @@ -81,17 +79,21 @@ function main(config){ var voterPositions; if(num==1){ voterPositions = [[150,150]]; + voterStrategy = ['nope']; }else if(num==2){ voterPositions = [[150,100],[150,200]]; + voterStrategy = ['nope','nope']; }else if(num==3){ voterPositions = [[150,115],[115,180],[185,180]]; + voterStrategy = ['nope','nope','nope']; } + if (config.voterStrategy) voterStrategy = config.voterStrategy for(var i=0; i Date: Mon, 31 Jul 2017 20:54:14 -0400 Subject: [PATCH 013/120] added strategies that rely on who the frontrunner is. --- newer.html | 18 +++++------ play/ballot6.html | 27 ++++++++++++++++ play/ballot7.html | 26 +++++++++++++++ play/ballot8.html | 27 ++++++++++++++++ play/election7.html | 11 +++---- play/election8.html | 7 ++-- play/js/Voters.js | 72 ++++++++++++++++++++++++++++++----------- play/js/main_ballot.js | 6 ++-- play/js/main_sandbox.js | 13 ++++---- 9 files changed, 162 insertions(+), 45 deletions(-) create mode 100644 play/ballot6.html create mode 100644 play/ballot7.html create mode 100644 play/ballot8.html diff --git a/newer.html b/newer.html index 115293ca..91198a1c 100644 --- a/newer.html +++ b/newer.html @@ -121,22 +121,21 @@

Lightly-strategic voting: "normalization"

-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+

Normalizing Voter

+

Best is 5. Worst is 1.

-

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try removing the pentagon candidate, and see what happens.

+

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try moving the losing yellow traingle candidate, and see what happens.

non-optimal
- try it

@@ -149,24 +148,23 @@

UNSTRATEGIC BALLOT

- non-optimal
- try it + Strategists win

-

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that triangle and square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

+

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that the red hexagon and the blue square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+

Strong Strategic Voter

+

Almost like strategic approval.

- +
diff --git a/play/ballot6.html b/play/ballot6.html new file mode 100644 index 00000000..fa35da7d --- /dev/null +++ b/play/ballot6.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/ballot7.html b/play/ballot7.html new file mode 100644 index 00000000..65f4e032 --- /dev/null +++ b/play/ballot7.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/ballot8.html b/play/ballot8.html new file mode 100644 index 00000000..ebda3cdc --- /dev/null +++ b/play/ballot8.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election7.html b/play/election7.html index aa554bdf..dc14276c 100644 --- a/play/election7.html +++ b/play/election7.html @@ -27,16 +27,15 @@ \ No newline at end of file diff --git a/play/election8.html b/play/election8.html index ca5f971b..89892f8a 100644 --- a/play/election8.html +++ b/play/election8.html @@ -31,11 +31,12 @@ system: "Score", candidates: 3, - candidatePositions: [[70,150],[150,150],[300-70,150]], + candidatePositions: [[100,150],[150,150+100],[300-100,150]], voters: 2, - voterPositions: [[30,150],[300-30,150]], - voterStrategy: ["normalized","nope"] + voterPositions: [[100,150],[300-100,150]], + voterStrategies: ["normalized","nope"], + frontrunners: ["square","hexagon"] }); \ No newline at end of file diff --git a/play/js/Voters.js b/play/js/Voters.js index b56605c4..e82179fc 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -19,7 +19,7 @@ function ScoreVoter(model){ return 0; }; - self.getBallot = function(x, y, strategy){ + self.getBallot = function(x, y, config){ // Scores for each one! @@ -46,10 +46,10 @@ function ScoreVoter(model){ } } self.model.idlastwinner = "square" - if(strategy == "justfirstandlast") { + if(config.strategy == "justfirstandlast") { scores[maxi] = 1 scores[mini] = 5 - } else if (strategy == "normalized") { + } else if (config.strategy == "normalized") { var fnorm = 1/ (maxdist-mindist); if (1) { var normit = function(d) {return (d-mindist)*fnorm;} @@ -65,20 +65,56 @@ function ScoreVoter(model){ scores[self.model.candidates[i].id] = gs; } } - } else if (strategy == "threshold") { - var windex = 0; - for(var i=0; i maxfront) { + maxfront = testd; + imaxfront = i; + } + } + } + windex.push(i); + } + if (config.strategy == "thresholdfrontrunners") { + var d_threshold = minfront; + var thresholdit = function(d) {return (d<=d_threshold) ? 5 : 1} // vote for the best frontrunner and everyone better + } else if (config.strategy == "normfrontrunners") { + var fnorm = 1/ (maxfront-minfront); + var normit = function(d) {return (d-minfront)*fnorm;} + var gs = function(d) { return 1+Math.round(4*(1-normit(d))); } + var thresholdit = function(d) {return (d<=minfront) ? 5 : (d>=maxfront) ? 1 : gs(d)} + } } - var d_threshold = dista[windex]; - var thresholdit = function(d) {return (d>=d_threshold) ? 1 : 5} var scores2 = dista.map(thresholdit); - var assignit = function(d,i) {scores[self.model.candidates[i].id] = d;} + var assignit = function(d,i) { scores[ self.model.candidates[i].id ] = d; } scores2.map(assignit) scores[mini] = 5; - } // otherwise, there is no strategy self.strategy == "nope" + }// otherwise, there is no strategy config.strategy == "nope" // Scooooooore return scores; @@ -145,7 +181,7 @@ function ThreeVoter(model){ return 0; }; - self.getBallot = function(x, y, strategy){ + self.getBallot = function(x, y, config){ // Scores for each one! var scores = {}; @@ -230,7 +266,7 @@ function ApprovalVoter(model){ self.approvalRadius = 100; // whatever. - self.getBallot = function(x, y, strategy){ + self.getBallot = function(x, y, config){ // Anyone close enough. If anyone. var approved = []; @@ -308,7 +344,7 @@ function RankedVoter(model){ var self = this; self.model = model; - self.getBallot = function(x, y, strategy){ + self.getBallot = function(x, y, config){ // Rank the peeps I'm closest to... var rank = []; @@ -389,7 +425,7 @@ function PluralityVoter(model){ var self = this; self.model = model; - self.getBallot = function(x, y, strategy){ + self.getBallot = function(x, y, config){ // Who am I closest to? Use their fill var closest = null; @@ -552,7 +588,7 @@ function GaussianVoters(config){ var p = points[i]; var x = self.x + p[0]; var y = self.y + p[1]; - var ballot = self.type.getBallot(x, y, config.strategy); + var ballot = self.type.getBallot(x, y, config); self.ballots.push(ballot); } }; @@ -588,7 +624,7 @@ function SingleVoter(config){ // UPDATE! self.ballot = null; self.update = function(){ - self.ballot = self.type.getBallot(self.x, self.y, config.strategy); + self.ballot = self.type.getBallot(self.x, self.y, config); }; // DRAW! diff --git a/play/js/main_ballot.js b/play/js/main_ballot.js index 7d391ac5..bc600ec0 100644 --- a/play/js/main_ballot.js +++ b/play/js/main_ballot.js @@ -2,7 +2,8 @@ window.ONLY_ONCE = false; function main(config){ ballotType = config.system; - strategy = config.strategy || "nope"; + config.strategy = config.strategy || "nope"; + config.frontrunners = config.frontrunners || ["square"]; // ONCE. if(ONLY_ONCE) return; @@ -20,7 +21,8 @@ function main(config){ model.addVoters({ dist: SingleVoter, type: VoterType, - strategy: strategy, + strategy: config.strategy, + frontrunners: config.frontrunners, x:81, y:92 }); model.addCandidate("square", 41, 50); diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index e3db4072..88280ea3 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -40,13 +40,13 @@ function main(config){ }; } - // Defaults... config = config || {}; config.system = config.system || "FPTP"; config.candidates = config.candidates || 3; config.voters = config.voters || 1; config.features = config.features || 1; // 1-basic, 2-voters, 3-candidates, 4-save + config.frontrunners = config.frontrunners || ["square"]; var initialConfig = JSON.parse(JSON.stringify(config)); Loader.onload = function(){ @@ -79,21 +79,22 @@ function main(config){ var voterPositions; if(num==1){ voterPositions = [[150,150]]; - voterStrategy = ['nope']; + voterStrategies = ['nope']; }else if(num==2){ voterPositions = [[150,100],[150,200]]; - voterStrategy = ['nope','nope']; + voterStrategies = ['nope','nope']; }else if(num==3){ voterPositions = [[150,115],[115,180],[185,180]]; - voterStrategy = ['nope','nope','nope']; + voterStrategies = ['nope','nope','nope']; } - if (config.voterStrategy) voterStrategy = config.voterStrategy + if (config.voterStrategies) voterStrategies = config.voterStrategies for(var i=0; i Date: Tue, 1 Aug 2017 11:11:22 -0400 Subject: [PATCH 014/120] added strategy per ballot. added buttons for adjusting the number of strategic voters. --- newer.html | 10 ++++---- play/election9.html | 44 +++++++++++++++++++++++++++++++++++ play/js/Voters.js | 48 ++++++++++++++++++++++++++------------- play/js/main_sandbox.js | 33 ++++++++++++++++++++++++++- play/js/seedrandom.min.js | 1 + 5 files changed, 114 insertions(+), 22 deletions(-) create mode 100644 play/election9.html create mode 100644 play/js/seedrandom.min.js diff --git a/newer.html b/newer.html index 6b081be3..e6713b8b 100644 --- a/newer.html +++ b/newer.html @@ -188,12 +188,12 @@

Strong Strategic Voter -
- -

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+
- +

+ Playing Chicken
+

+
diff --git a/play/election9.html b/play/election9.html new file mode 100644 index 00000000..a136b327 --- /dev/null +++ b/play/election9.html @@ -0,0 +1,44 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/js/Voters.js b/play/js/Voters.js index e82179fc..7005b01e 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -19,7 +19,7 @@ function ScoreVoter(model){ return 0; }; - self.getBallot = function(x, y, config){ + self.getBallot = function(x, y, strategy, config){ // Scores for each one! @@ -46,10 +46,10 @@ function ScoreVoter(model){ } } self.model.idlastwinner = "square" - if(config.strategy == "justfirstandlast") { + if(strategy == "justfirstandlast") { scores[maxi] = 1 scores[mini] = 5 - } else if (config.strategy == "normalized") { + } else if (strategy == "normalized") { var fnorm = 1/ (maxdist-mindist); if (1) { var normit = function(d) {return (d-mindist)*fnorm;} @@ -65,8 +65,8 @@ function ScoreVoter(model){ scores[self.model.candidates[i].id] = gs; } } - } else if (config.strategy == "threshold" || config.strategy == "thresholdfrontrunners" || config.strategy == "normfrontrunners") { - if (config.strategy == "threshold") { + } else if (strategy == "threshold" || strategy == "thresholdfrontrunners" || strategy == "normfrontrunners") { + if (strategy == "threshold") { var windex = 0; for(var i=0; if;)h[f]=f++;for(f=0;d>f;f++)h[f]=h[g=s&g+a[f%c]+(b=h[f])],h[g]=b;(e.g=function(a){for(var b,c=0,f=e.i,g=e.j,h=e.S;a--;)b=h[f=s&f+1],c=c*d+h[s&(h[f]=h[g=s&g+b])+(h[g]=b)];return e.i=f,e.j=g,c})(d)}function k(a,b){var c,d=[],e=typeof a;if(b&&"object"==e)for(c in a)try{d.push(k(a[c],b-1))}catch(f){}return d.length?d:"string"==e?a:a+"\0"}function l(a,b){for(var c,d=a+"",e=0;ea;)a=(a+c)*d,b*=d,c=s.g(1);for(;a>=r;)a/=2,b/=2,c>>>=1;return(a+c)/b},o,"global"in f?f.global:this==c)};if(l(c[i](),b),g&&g.exports){g.exports=t;try{o=require("crypto")}catch(u){}}else h&&h.amd&&h(function(){return t})}(this,[],Math,256,6,52,"object"==typeof module&&module,"function"==typeof define&&define,"random"); \ No newline at end of file From ea50301102ed7d42734015e02e6eb9f7b72bcb15 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Tue, 1 Aug 2017 13:56:50 -0400 Subject: [PATCH 015/120] put strategy into a function, to get ready to use it 3 times. also fixed bug with percent voter strategy. --- play/election1.html | 1 + play/election2.html | 1 + play/election3.html | 1 + play/election4.html | 1 + play/election5.html | 1 + play/election6.html | 1 + play/election7.html | 1 + play/election8.html | 1 + play/election9.html | 1 - play/js/Voters.js | 30 ++++++++++++++++++------------ play/js/main_sandbox.js | 10 +++++++--- 11 files changed, 33 insertions(+), 16 deletions(-) diff --git a/play/election1.html b/play/election1.html index 30fb9c14..bc6eb31e 100644 --- a/play/election1.html +++ b/play/election1.html @@ -22,6 +22,7 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/js/Voters.js b/play/js/Voters.js index 474cc846..d9c18cad 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -199,31 +199,18 @@ function ThreeVoter(model){ // Scores for each one! var scores = {}; - var mindist = 9999; - var maxdist = -9999; - var mini = null; - var maxi = null; + var dista = []; for(var i=0; i maxdist) { - maxdist = dist; - maxi = c.id - } } - - scores[maxi] = 0 - scores[mini] = 2 - - // Scooooooore - return scores; + self.model.idlastwinner = "square" + scores = dostrategy(dista,scores,0,2,strategy,self.model.idlastwinner,config.frontrunners,self.model.candidates) + return scores }; @@ -281,36 +268,30 @@ function ApprovalVoter(model){ self.approvalRadius = 100; // whatever. self.getBallot = function(x, y, strategy, config){ - - // Anyone close enough. If anyone. - var approved = []; - var mindist = 9999; - var maxdist = -9999; - var mini = null; - var maxi = null; + + // re-use code for scores above, but with different range + // Scores for each one! + var scores = {}; + var dista = []; for(var i=0; i maxdist) { - maxdist = dist; - maxi = approved.length - 1 - } - } - - if(mindist>=self.approvalRadius){ - approved.push(mini); - } - if(maxdist Date: Tue, 1 Aug 2017 18:24:27 -0400 Subject: [PATCH 018/120] added star stragegy leaving room for 1st "starnormfrontrunners". gui improvement for 3 scores. --- newer.html | 78 ++++++++++++++++++++++++------------- play/ballot10.html | 27 +++++++++++++ play/ballot9.html | 27 +++++++++++++ play/election11.html | 49 +++++++++++++++++++++++ play/election12.html | 50 ++++++++++++++++++++++++ play/election13.html | 49 +++++++++++++++++++++++ play/election14.html | 49 +++++++++++++++++++++++ play/img/ballot_range3.png | Bin 0 -> 25461 bytes play/img/ballot_three.png | Bin 0 -> 34476 bytes play/js/Ballot.js | 16 ++++++-- play/js/Voters.js | 12 +++--- sandbox/sandbox.html | 1 + 12 files changed, 323 insertions(+), 35 deletions(-) create mode 100644 play/ballot10.html create mode 100644 play/ballot9.html create mode 100644 play/election11.html create mode 100644 play/election12.html create mode 100644 play/election13.html create mode 100644 play/election14.html create mode 100644 play/img/ballot_range3.png create mode 100644 play/img/ballot_three.png diff --git a/newer.html b/newer.html index 6b77f699..faea6e9c 100644 --- a/newer.html +++ b/newer.html @@ -193,7 +193,7 @@

Strong Strategic Voter Also, here's a score example

- +

@@ -201,7 +201,7 @@

Strong Strategic Voter Playing Chicken

- +

@@ -214,12 +214,20 @@

Strong Strategic Voter -
+
-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+

+ Playing Chicken with Different Methods
+

+ - +
+
+ +

+ Center Squeeze
+

+
@@ -235,10 +243,10 @@

Star voting

-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+

Star Strong

+

Keeps a space for the best.

- +
@@ -248,12 +256,12 @@

UNSTRATEGIC BALLOT

And here's the chicken dilemma you saw above:

-
- -

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+
- +

+ Chicken Star
+

+
@@ -267,10 +275,10 @@

3-2-1 voting

-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+

321 Strategic

+

Approval with an extra level.

- +
@@ -280,12 +288,12 @@

UNSTRATEGIC BALLOT

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

-
- -

UNSTRATEGIC BALLOT

-

Judge, don't choose.

+
- +

+ 321 Chicken
+

+
@@ -295,14 +303,32 @@

UNSTRATEGIC BALLOT

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

-
+ + +
+
+

SANDBOX MODE! (link to just this)

+ +
+
+

+ One hope for Sandbox Mode is that readers can debate with me and each other using this tool! + Not just telling me I'm wrong, but showing me I'm wrong. + For example – + + here's a model I made in Sandbox Mode, + showing an interesting argument against Approval & Score Voting. + Granted, this tool is very limited – it doesn't handle strategic voting or imperfect information – + but I think it's a start, and may help improve our Democratic Discourse™ +

+
diff --git a/play/ballot10.html b/play/ballot10.html new file mode 100644 index 00000000..3ef87165 --- /dev/null +++ b/play/ballot10.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/ballot9.html b/play/ballot9.html new file mode 100644 index 00000000..3a088fb2 --- /dev/null +++ b/play/ballot9.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election11.html b/play/election11.html new file mode 100644 index 00000000..6db69b9e --- /dev/null +++ b/play/election11.html @@ -0,0 +1,49 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election12.html b/play/election12.html new file mode 100644 index 00000000..d11c222d --- /dev/null +++ b/play/election12.html @@ -0,0 +1,50 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election13.html b/play/election13.html new file mode 100644 index 00000000..53750cea --- /dev/null +++ b/play/election13.html @@ -0,0 +1,49 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/election14.html b/play/election14.html new file mode 100644 index 00000000..f04ca1c5 --- /dev/null +++ b/play/election14.html @@ -0,0 +1,49 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/img/ballot_range3.png b/play/img/ballot_range3.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d4d83558aa8562b7568b3ffaf9a853bf55ec24 GIT binary patch literal 25461 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 literal 0 HcmV?d00001 diff --git a/play/js/Ballot.js b/play/js/Ballot.js index 8eac4449..610b2a6d 100644 --- a/play/js/Ballot.js +++ b/play/js/Ballot.js @@ -35,14 +35,14 @@ function ThreeBallot(config){ var self = this; config = config || {}; - config.bg = "img/ballot_range.png"; + config.bg = "img/ballot_range3.png"; Ballot.call(self, config); // BOXES! self.boxes = { - square: self.createRate(133, 100, 0), - triangle: self.createRate(133, 143, 3), - hexagon: self.createRate(133, 184, 1) + square: self.createThree(133, 100, 0), + triangle: self.createThree(133, 143, 3), + hexagon: self.createThree(133, 184, 1) }; // On update... @@ -189,5 +189,13 @@ function Ballot(config){ frame:frame }); }; + self.createThree = function(x,y,frame){ + return self.createSprite({ + img: "img/ballot_three.png", + x:x, y:y, + w:225, h:50, + frame:frame + }); + }; } diff --git a/play/js/Voters.js b/play/js/Voters.js index d9c18cad..f4ba9bd9 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -34,11 +34,11 @@ function dostrategy(dista,scores,minscore,maxscore,strategy,lastwinner,frontrunn } else { // equivalent loop way of doing things for(var i=0; i=maxfront) ? minscore : gs(d)} } } var scores2 = dista.map(thresholdit); var assignit = function(d,i) { scores[ candidates[i].id ] = d; } scores2.map(assignit) + if (strategy == "starnormfrontrunners") maxscore++; scores[mini] = maxscore; }// otherwise, there is no strategy strategy == "nope" diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index 3f5f3ce9..7ee0fc62 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -24,6 +24,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ To Build an Even Better Ballot? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

My name is Jameson Quinn. If spending 10,000 hours on something makes you an expert, then I'm easily an expert on voting methods. And right here in your browser, I want to give you a tool that can help you think like an expert on this in a whole lot less than 10,000 hours. If you read all the way through this page, you'll be well on your way. You'll know a lot about voting methods, and you'll understand in a very intuitive way how much this knowledge could be used to make politics healthier.

+ +

I think this tool is a lot of fun and I'm really excited to share it with you. But before I do, I should acknowledge the people who have made this possible. Nicky Case made the first version; Pareto Man did most of the work on the current one; and some of the key ideas come from Ka-Ping Yee and Warren Smith. There's more acknowledgements at the bottom. If you want to be part of this chain of awesomeness, this is all open source, so you're free to make it even better. You can also support Electology.org, aka the Center for Election Science, a nonprofit that works on these issues.

+ +

So, let's get started.

+ +

If you live in the US (or Canada or the UK, for that matter), you've probably read plenty of depressing or scary articles about politics recently. There are a lot of problems in politics, and it can seem hopeless. How can we possibly fix it all?

+ +

I want to show you how democracy itself can be fixed. Doing that wouldn't immediately fix all the other problems. But it would make fixing everything else substantially easier.

+ +

In order to see how to fix democracy, you have to understand how it's broken, right at its root: we're doing voting wrong. Choose-one plurality voting, the voting method we have in most big English-speaking countries, is just about the worst voting method ever used. It's easy to see why other methods are better. It doesn't take complicated rules to improve on choose-one plurality; approval voting is arguably even simpler, and better in every way.

+ +

Once I've shown you that, I'll move on to part II, where I'll get into some of the more complex elements of voting theory (aka social choice theory; a subfield of game theory). I'll discuss strategic voting, and show you several other voting methods, such as score voting, IRV, Condorcet, Star, and 3-2-1. I'll discuss some of the strengths and weaknesses of these methods, and let you play with the examples that have convinced me which methods are better for which situations — approval for simplicity, 3-2-1 or Star for a balance betwen expressiveness and robustness against strategy, and score for situations where the voters share common end goals and are merely voting on the best means to those goals — and which are usually worse — plurality worst of all, but IRV not too much better.

+ +

Imagine your town is planning to buy one fire truck of a fancy new kind, and they're having a vote to decide which firehouse to keep it at. Every voter wants it kept as close to their home as possible, so it can arrive quickly in case of a fire.

+ +

How would you vote? It's a trick question. How you'd vote depends on what voting method is being used. Let's start with choose-one plurality voting, where you're only allowed to, um, choose one. Here's a simple example, so you can play around with it; drag the shapes/candidates/firehouses and the voter/home representing you and see what happens to the ballot.

+ + + +

Say that everyone votes like that; a simple, honest assesment of which candidate is closest, without strategizing about other voters. Here's how it might come out:

+ + + +

This is an easy voting situation to visualize, because all that matters is where the candidates (firehouses) and voters (homes) are physically. In real life, of course, it's not so much your physical location that matters, but your "location" on ideology and/or issues; and that's hard to even define or know, much less draw on a neat 2-dimensional map. But these 2D let us show pretty much all the interesting kinds of things that can happen. So now I'll stop saying "firehouse" and "home" and just say "candidate" and "voter".

+ +

So what's wrong with this voting method? Well, anyone who doesn't vote for one of the two frontrunners has no say in which of them wins; their vote is essentially wasted. So if two candidates are similar, they "split the vote" and "spoil the election" so that neither one of them wins. For instance, in the election above, reset and then try moving the hexagon close to the square. Hexagon steals votes from Square and so Triangle wins!

+ +

+ +

+ +

+ + + + + + +

Never fear. I have two more ssdtasdt methods to teach you about, and I hope I can convince you that they're the best yet.

+ +

Who's "me"? I'm Jameson Quinn, a statistics student at Harvard and a board member of the Center for Election Science. I'm not as good a designer or interactive programmer + as Nicky, as you can see from the title above. But I have spent a lot of time thinking about voting methods.

+ +

I'm also not as cool as Nicky, but I'm going to pretend to be. If my pale imitation of their chatty tone puts you off, then... well, I guess you can wait for my peer-reviewed paper.

+ +

So, the story so far: FPTP voting is horrible. There's all kinds of other voting methods that would be better. We're looking for the one that's best. Some activists think that's Instant Runoff Voting (IRV), but Nicky and I both disagree; it can prematurely eliminate centrists, and requires centralized counting. Nicky says they lean towards score voting, and I can see why: it's easy to understand, and in all the simulations Nicky built, it does a great job of satisfying all the little dot-on-screen voters.

+ +

By the end of this interactive, you're going to understand the three methods I consider the best. One of them Nicky already showed you: approval voting, which is great because it's so simple and because it has absolutely no downsides versus FPTP. The other two are newer, but they use similar basic ideas to what you've already seen. I hope you like all three methods.

+ +

But before I show you the new methods, I have to show you why score voting isn't already the greatest method possible. So I have to explain strategic voting.

+ +

Unstrategic voting

+ +

Remember how Nicky's voters worked in Score Voting? They just gave each candidate a number based on the absolute distance. Like this:

+ + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+

Description: this should just be an unstrategic score voter, as in ncase's thing. Allow ballot picture to show 0 scores.

+ +

But notice something about that ballot? For many positions of the voter and candidate, the ballot doesn't include a score of 5 or a score of 0. If you actually voted like that, you'd be giving up on some of your voting power. Say Triangle is your favorite, and you give them a score of 3, which also happens to be their average score. If Square wins with a score of 3.2, you're going to feel very silly for not giving a triangle a 5, in order to pull their average up as high as you can.

+ +

Digression: median systems

+ + skip this digression + +

Ever watched the Olympics? In events like figure skating, there are a number of Olympic judges from different countries. In order to prevent any one judge from having too much influence, they use a "trimmed mean": they throw away the highest and lowest scores before they take the average.

+ +

Olympic judges are supposedly supposed to be unbiased. But for voters, there's nothing wrong with having political opinions. (I mean, obviously your opinions, dear reader, are the best, and everybody else should just listen to you. But much as I'd like to, I can't force them to.) So let's imagine voting used the olympic system.

+ +

Throwing away just one highest and lowest score, with thousands or millions of voters, obviously wouldn't make an appreciable difference. So we'd have to throw away some more scores. And, why not? Let's throw away a few more while we're at it.

+ +

When should we stop? When there's just 1 or 2 scores left to take the average. But if you do that, most people wouldn't called that a "trimmed mean" anymore; they'd just call it the median, the middle number.

+ +

There are several voting methods that use the median to find the winner. (It turns out that can lead to a lot of ties, so you need a tiebreaker system to avoid that.) In the 1910s, over a dozen US cities, starting with Grand Junction, CO, used "Bucklin voting", a median-based system using a hybrid ranked/rated ballot. More recently, voting theorists Balinski and Laraki have proposed Majority Judgment, a median-based method using a rated ballot that's now been used in a number of competitions.

+ +

Using the median reduces the incentives for a single voter to strategize. After all, unless you happen to be the exact median rating for a candidate, the only thing that matters about the rating you gave them is whether it's above or below the median.

+ +

Still, large groups of voters can still get a strategic advantage. The larger the voting bloc, the greater the chance is that the median rating for a given candidate happens to be a voter in that bloc.

+ +

I used to think that median voting methods were the best. But then I did the simulations I'll talk about below, and they were merely OK; not much better outcomes than approval voting, but without the simplicity. I still think they're hugely better than FPTP and a bit better than IRV, but I'm not sold enough on them for it to be worth my time programming them in to Nicky's simulator.

+ +

Lightly-strategic voting: "normalization"

+ +

As I suggested above, in the real world, in score voting and similar methods, most voters will want to make sure that their ballot contains at least one candidate each at the top rating and at the bottom rating. The simplest way to do that (even though the name sounds complicated and math-y) is "normalization". That just means that you set the top and bottom ratings to be however good your favorite and least-favorite candidates are, and then spread the rest of the ratings evenly between that.

+ +

Here's an example of a "normalizing" voter for you to play with:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+

Description: this should be like ncase's "drag the voter" examples, with a normalizing score voter. This voter should have a series of circles, where the closest one intersects the closest candidate and the farthest one the farthest candidate. Thus, as you moved the voter or candidates the circles would change size.

+ +

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try removing the pentagon candidate, and see what happens.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+

This should be a score voting scenario with 100% normalizing voters. the voter median around (0,0), and candidates square (3,0), triangle (-2,0), pentagon (-4,0). Pentagon voters are not enthusiastic enough about triangle so square wins, even though triangle is higher utility. Removing penta fixes the problem.

+ +

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+

groups of voters at (-4,0)non-normalizing and (4,0)normalizing. Cands at (-2.5,.5), (-2,0), (0,0), (2,0), (2.5,.5). (2,0) wins.

+ +

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that triangle and square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

+ + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

Single-voter example with 3 candidates and a voter who normalizes based on only the 2 of them.

+ +

Just as normalized voters can have more voting power than naive voters, strongly strategic voters can have more than normalized voters (as long as they are not too far off in guessing the frontrunners). This is a potential weakness of score voting.

+ +

Is approval voting immune to this kind of voting strategy? No; in fact, in the early seventies, mathematicians Gibbard and Satterthwaite both independently proved the theorem which bears their names, showing that no non-dictatorial voting method with more than 2 options is entirely immune to strategy. Unlike Arrow's theorem, which Nicky discussed, this one goes for any kind of voting method — ranked, rated, or whatever. So yes, approval voting is more resistant to strategy than score; but not immune.

+ +

(Note: advocates for IRV sometimes garble this point by saying that in approval voting the best strategy is to "bullet vote" for only your favorite candidate, and that this would lead it to devolve back to FPTP. That's just wrong; if voters are strategically voting for somebody other than their favorite in FPTP, then there's no way it would make sense for them to bullet vote in approval. Approval voting isn't perfect, but it simply does not break down to FPTP.)

+ +

One scenario where approval becomes a factor is called the "chicken dilemma". Imagine 3 groups of voters, with 25%, 30%, and 45% of the vote respectively. Say that the first two groups both prefer each other over the third, so that either of them could beat that third opponent by 55% to 45%. Whichever of the first two groups strategically gives fewer approvals to its rival will win... unless neither of them gives enough, in which case the opponent will win. This is called a "chicken dilemma" because it's like a game of chicken between the voters for the two similar rivals: they can "swerve" and let their second-favorite win, or they can "drive straight" and either win (if the other side swerves) or crash (if the other side doesn't).

+ +

Here's that scenario in sandbox form. The slider on the right controls the percent of the smallest group that is strongly strategic between triangle and square; all the rest of the voters use normalized strategy (that is, approve any candidate better than the average of their favorite and least-favorite).

+ + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

Clumps of voters at (x,y,size): (-2,1,6); (-2,-1,4)slider; (3,0,10).

+ + +

The "chicken dilemma" is a genuinely tough situation for almost any voting method. The motivations for the two rival factions to vote strategically are hard to minimize safely. Voting methods that go too far out of their way to punish strategic voters in this scenario tend to get the wrong answer in other, more-common scenarios like center squeeze. Look at how these various methods deal with both of these situations:

+ + + +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

two different sandboxes. One repeats chicken dilemma case from above but also lets you switch voting methods (plurality, IRV, approval, score). The other one has center squeeze.

+ +

So, now I've explained why strategic voting makes things tricky, I can explain my two favorite voting methods: star voting and 3-2-1 voting.

+ +

Star voting

+ +

"Star", or more precisely, "s+ar", stands for "score plus automatic runoff." In this method, voters use the same ballot as score voting. Between the two candidates with the highest scores, the winner is the one that comes higher on more ballots. Here's a one-voter star election. You can choose between three kinds of strategy: normalized, moderately strategic, and strongly strategic. The first and last kinds you've seen before. The third is almost like a strongly strategic voter, except that the ratings may be changed by one to avoid giving a frontrunner the same score as any other candidate. Here's a one-voter election:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

one-voter star election

+ +

And here's the chicken dilemma you saw above:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

chicken dilemma with star

+ +

3-2-1 voting

+ +

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

one-voter 3-2-1

+ +

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ +

chicken dilemma with 3-2-1

+ +

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + + +
+
+ + + + + +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ + + + +
+
+ +

+ click & drag
the candidates and the voter:
+

+ + +
+
+ +

It's a tough choice. Triangle's got some sharp points, but Square understands more sides! Alas, in the end, you can only vote for one.

+ +

Of course, there's more than just one voter in an election. Let's simulate what an election would look like with 100+ voters.

+ +
+
+ +

+ drag the candidates & voters around.
(to move voters, drag the middle of the crowd)
watch how that changes the election:
+

+ + +
+
+ +

Now let's consider a different election. Say Tracy Triangle is already beating Steven Square in the polls, and a third candidate, Henry Hexagon , sees this. (Hexagon's supporters like how he tackles problems from more angles) Inspired by her success, Hexagon swoops in and takes a political position close to Triangle's.

+ +

Now, you'd think giving the voters more of what they want should result in a better choice, or at least, not result in a worse choice, right? Well...

+ +
+
+ +

+ + at first, beats .
+ drag to just under ,
+ and see what happens:
+

+ + +
+
+ +

That's right. Steven Square, our least popular candidate, now wins! This is because when you have two good candidates, they "steal" votes from each other, letting a bad third candidate win.

+ +

This is called the spoiler effect. The most famous real-world example of this was in 2000, when Ralph Nader "stole" votes from Al Gore, letting George Bush win. And though the spoiler effect didn't play a big role in 2016, its impact could still be felt.

+ +

In the Republican primary, one anti-establishment nominee, Trump, ran against sixteen GOP establishment nominees, who all "stole" votes from each other, letting Trump grab the nomination, easily. As for the Democratic primary, fear of splitting the vote prevented Sanders from running as independent. And to cap it all off, there was always the worry that other candidates like Johnson, Stein, and McMullin could spoil the election.

+ +

But again, this is not about the 2016 U.S. election.

+ +

This is about designing a democracy that people can trust.

+ +

Despite so much hoopla around the 2016 election, a full half of Americans did not vote. Even of those who voted for Clinton/Trump, 20% of them said their candidates were untrustworthy, and voted for them anyway. And around the world, people's trust in their governments – or the trustworthiness of their governments – has never been lower. It's more than America at stake. It's every democracy in the world.

+ +

...so yeah, no pressure.

+ +

Rebuilding trust is a complex problem with no easy solutions. But I think there is an easy first step. It's a step that could get rid of our “lesser of two evils” problem, and give us citizens more choices, better choices. And yet, it won't be as daunting as fixing campaign finance or gerrymandering or lack of proportional representation, no, it'd just require changing a piece of paper, and how we count those pieces of paper.

+ +

This idea is not the most important issue. It won't solve everything. But as a first step? It'd give us the biggest bang-for-buck.

+ +

Let's talk about how to build a better ballot.

+ +
+ + + + +
+ +

Now, some of you may have a couple objections!

+ +

First objection. Why would the people in power change the voting method that got them in power? Well, the spoiler effect has cost both Dems & Reps a major election before. Getting rid of that glitch would be a win-win for major and minor parties! Also, voting reform is already picking up steam. Just last month, Maine adopted Instant Runoff, and Justin Trudeau, Canada's Cutie-In-ChiefCynic-in-Chief, will be moving his nation towards a better voting system in 2017. (UPDATE: actually, he didn't do that.)

+ +

Second objection. Didn't some guy once prove that all voting methods will be unfair? Not quite. You're thinking of the infamous Impossibility Theorem by Kenneth Arrow, the mathematician in the 1950's who founded the whole study of voting methods.

+ +

Two answers to that: 1) some voting methods can still be more fair than others, even if none are perfect. And 2) Kenneth Arrow's proof doesn't apply to all voting methods! That's a misconception. It only applies to voting methods where you rank candidates. Later, we'll see some voting methods where you don't rank candidates – along with other alternatives to our current, glitchy voting method.

+ +

But first, let's take a closer look at the voting method we do have:

+ +
+
+ +

FIRST PAST THE POST (FPTP)

+

same as before. click & drag
the candidates and voter

+ + +
+
+ +

How To Count: Simply add up the votes. Whoever gets the most votes, wins.

+ +

Sounds logical enough. But as you saw earlier, it can lead to a weird glitch, where having two good candidates can make the election go to a third bad candidate. This is why some people vote "strategically", voting not for their actual honest favorite, but voting for the lesser of two evils. And strategic voting is fine – but! – ask yourself this: how can we expect our elected officials to be honest, when our voting method itself doesn't let us be honest?

+ +

So, to fix the spoiler effect, other voting methods have been suggested. Such as...

+
+
+ +

RANKED VOTING

+

again, click & drag

+ + + +
+
+ +

How To Count: There's actually several different ways to count these kinds of ballots. Here, I'll just show you the top three:

+ +

+ Instant Runoff Voting (IRV): + This one is the most popular alternative to First Past The Post (FPTP). + Australia and Ireland use it in national elections. + San Francisco, Minneapolis, and Portland, Maine use it in local elections. + And Justin Trudeau, Prime Man-ister of Canada, + is leaning towards Instant Runoff, too. +

+ +

+ (Note: Instant Runoff Voting is also called “Ranked Choice Voting”, + even though there's other ways to count ranked ballots. + IRV is also often just called “Alternative Vote”, + even though there's a flippin' dozen other voting methods. + Such selfish naming! Sheesh!) +

+ +

IRV is a bit more complicated than FPTP, but here's how it works:

+ +
    +
  1. Count up the #1 choices.
  2. +
  3. If someone has more than 50%, they win! END.
  4. +
  5. If not, eliminate the last-place loser.
  6. +
  7. Run a new "round" of the election, minus that loser.
  8. +
  9. Repeat until someone has 50% or more.
  10. +
+ +

If that seems like too much, there is a much simpler method of counting ranked ballots...

+ +

Borda Count: Simply add up the rank numbers. Like in golf, whoever has the lowest score, wins. Borda count is used in Slovenia and a bunch of tiny islands in Micronesia.

+ +

But if you want an even nerdier way of voting, you could try...

+ +

Condorcet Method: Run a simulated "election" between every pair of candidates, using the info on voters' ballots. IF there's a candidate who beats all other candidates in one-on-one "elections", that candidate wins the real election. However, that's a very big "IF". (as we'll see later...) The upside is, when this method does pick a winner, it's always the “theoretically best” candidate! Currently, this method is not being used by any governments, and is only being used by neeerrrrrds.

+ +

So, those are the voting methods where you rank candidates – the ones that Kenneth Arrow proved would always be unfair in some big way! But what of voting methods where you don't rank candidates? They're less well-known, but now, at least you'll know 'em:

+ +
+
+ +

APPROVAL VOTING

+

yup, stiiiiill click & drag

+ + + +
+
+ +

How To Count: Simply add up the approvals. Whoever gets the most approvals, wins.

+ +

Wait, picking more than one candidate? Doesn't that violate the one-vote-per-person rule? I hear you ask. Well, your vote was never a single check mark, your vote was always the whole ballot. And on this ballot, you get to honestly express all the candidates you approve of, not just your favorite or strategic second-favorite.

+ +

But if you want a more expressive voting method, why not try...

+ +
+
+ +

SCORE VOTING

+

you guessed it

+ + + +
+
+ +

How To Count: Simply add up the ratings. Whoever has the highest average score, wins. Kind of like Amazon reviews, but with democracy. (Note: this is not a ranking method, because two candidates can have the same score.)

+ +

So there's our top 6 voting methods: the one we use, and five popular alternatives. But how can we tell if these alternatives are actually better? What glitches might they have? And which voting method – if any – can we say is "the best"?

+ +

Like before, let's simulate 'em.

+ +
+ + + + +
+

Remember that simulation of the spoiler effect from earlier? Well, here it is again, but now you can switch between the six different voting methods! Here's the "spoiler effect" simulation again. See how different voting methods deal with potential spoilers:

+
+
+

+ drag to just under to create a spoiler effect.
+ then compare the 6 different voting methods: +
+ + (note: in the rare cases there's a tie, i just randomly pick a winner) + +

+ + +
+
+ +

As you could see, every voting method except First Past The Post is immune to the spoiler effect. So, that's it, right? Ding dong, the glitch is dead? Just pick any other alternative voting method and be done with it?

+ +

But, alas. In getting rid of one glitch, some of these alternative voting methods create other glitches – for some, the cure is even worse than the disease.

+ +

For example, here's a sim of Instant Runoff Voting. In the beginning, Tracy Triangle is already winning, and you're going to move the voters even closer to her. Obviously, if a candidate is already winning an election, and becomes even more popular, they should still win afterwards, right?

+ +

You can probably guess where this is going...

+
+
+ +

+ drag the voters slowly up towards : +

+ + + +
+
+ +

What happened? + Originally, is eliminated in the first round, so + + goes against a weaker , and wins. + But when you move the voters closer to , + the loser changes! + So now, is eliminated in the first round, + which means goes against a stronger , + and loses.

+ +

Under Instant Runoff, it's possible for a winning candidate to lose, by becoming more popular. What a glitch!

+ +

How often does this actually happen in real life? There's a couple confirmed examples, and mathematicians estimate this glitch would happen about 14.5% of the time. But sadly, we can't know for sure, because governments usually don't release enough info about the ballots to reconstruct an IRV election & double-check the results.

+ +

So, not only is Instant Runoff's glitch as undemocratic as First Past The Post's glitch, it's possibly worse – because while FPTP's counting method is simple and transparent, Instant Runoff is anything but. And a lack of transparency is an even deadlier sin nowadays, when our trust in government is already so low.

+ +

(But wait! We'll be talking about the risk of strategic voting later. + Can IRV can make a comeback? Stay tuned...)

+ +

So much for the most popular alternative. What about the second-most popular, Borda Count? In this next simulation, you move a losing candidate closer to another losing candidate. Under FPTP, the spoiler effect would split their votes, making both of them lose even more. But watch what happens under Borda Count instead...

+ +
+
+ +

+ drag to just slightly left of : +

+ + + +
+
+ +

Yup. Borda Count has a reverse spoiler effect. Instead of one good candidate hurting another good candidate by moving closer, with Borda Count, one bad candidate can help another bad candidate by moving closer.

+ +

Here's what happened: at first, some voters ranked + >>, + but when you moved closer to , + those voters then swung to ranking + >>, + hurting enough + to make her lose to .

+ +

Still, Borda's not the worst, and at least it's simpler and more transparent than Instant Runoff. But how does Condorcet Method compare? When Condorcet picks a winner, it's always the “theoretically best” winner – but that's when it picks a winner.

+ +

So far, I've just been simulating voters as a single group, with a center and some spread. But seeing how polarized politics is nowadays, one could imagine several groups of voters, with totally different centers. Now, Condorcet tries to pick the candidate who beats all other candidates in one-on-one races. But with polarized voters, you could end up with a Rock-Paper-Scissors-like loop, where a majority of voters prefer A to B, B to C, and C to A.

+ +

In certain situations, the other voting methods just had glitches. In Condorcet, the voting method crashes. Try it out for yourself:

+
+
+ +

+ create your own “condorcet cycle”!
+ move the voters in such a way that NOBODY wins: +

+ + + +
+
+ +

Now, in actual practice – not that any government actually uses this voting method – when Condorcet fails to find a winner, the election falls back to another method like Borda Count. But if you do that, it'll get the glitches of its backup method. So it goes.

+ +

First Past The Post. Instant Runoff. Borda Count. Condorcet Method. Those were all the voting methods that use ranking – the ones that our math boy, Kenneth Arrow, proved would always be unfair or glitchy in some big way. What about the voting methods that don't use ranking, like Approval & Score voting? Well...

+ +

...I couldn't come up with a simulation to show their flaws. Because, in theory, they don't have many big flaws.

+ +

+ But that's a really, really, really big “in theory!” + It may be that, in practice, strategic voters use Approval & Score Voting exactly like First Past The Post – + only approving or giving 5 stars to their top candidate, and disapproving or giving 1 star to all others, + even if they actually like the others. + (See FairVote's critique of Approval Voting, and defense of Instant Runoff) +

+ +

+ Then again, even if Approval & Score Voting disincentivize you from expressing an honest second choice, + FPTP and IRV punish you for expressing an honest first choice. + Besides, if Approval can be "gamed", then that goes double for IRV. + (See this mathematician's critique of FairVote's critique, and defense of Approval) + So, in the end... [confused shrugging sounds]

+ +

+ We're gonna need a hecka lot more simulations. +

+ +

+ So, below is a chart + (source), + showing the results of 2.2 million simulations. + A huge variety of scenarios were tested. All-honest voters. + All-strategic voters. Half-honest, half-strategic. + Voters who know each others' preferences. + Voters who don't know each others' preferences. + Voters who only sorta-know each others' preferences. + And so on. + You can tell that a real mathematician made this chart, + because it's makin' my eyes bleed: +

+ +

+ +

+ Each voting method's results is shown as an ugly-blue bar. + The further to the right a voting method is, the more it "maximizes happiness" for the voters. + The higher up a voting method is, the simpler it is. + And a bar's width shows the range of a voting method's performance, + given different ratios of honest-to-strategic voters. +

+ +

+ The first thing to note is that strategic voting makes voters less happy than honest voting + – in all voting methods! I was very surprised when I first learnt that. + (But it makes sense, if you think about, say, a crowded room full of people trying to talk. Any one person can be "strategic" by shouting over others, but if everybody is "strategic", nobody can hear anybody, and all you're left with is sore throats and sad peeps.)

+ +

The other thing to note is which voting methods make people the happiest. If you have mostly honest voters, Score Voting is best. (with Borda Count a close second) And if you have mostly strategic voters, then both Approval & Score Voting are best. (and with strategic voters, IRV does just as bad as FPTP)

+ +

However, those are still computer simulations. How would these different voting methods play out in real life? Well, we can't just get the DeLorean up to 88, go back in time before the 2016 election, change the voting method, and see what would happen...

+ +

...or can we?!

+ +

No, no we can't. But last month, researchers did something close enough. + A polling study asked 1,000+ U.S. registered voters to rank & rate the six presidential candidates, + to simulate who would've won the (popular) vote under different voting methods! + (But keep in mind that if we had a different voting method in the primaries, we'd have different candidates entirely. + So take this study with a pillar of salt.) + The results: under Instant Runoff, Condorcet, and Approval Voting, the winner would've been Hillary Clinton. But under Score Voting, the winner would've been Donald Trump. And under Borda Count, the winner would've been... uh... Gary Johnson? +

+ +

?????

+ +
+
+

+ a guesstimated model of the 2016 US election?...
+ + how Clinton wins IRV, + Trump wins Score, + and Johnson wins Borda?? + +

+ +
+
+ +

Anyway.

+ +

Before we wrap all this up – remember Kenneth Arrow? The infamous mathematician who founded the study of voting methods in the 1950's? Well, in an interview 60 years later, Kenneth Arrow had this to say, about which voting method he likes most now:

+ +

+ “Well, I’m a little inclined to think that score methods [like Approval & Score Voting] where you categorize in maybe three or four classes [so, giving a score out of 3 or 4, not 10 or 100] probably – in spite of what I said about manipulation [strategic voting] – is probably the best.”

+ +

That's as strong an endorsement as you'll ever squeeze out of a math-head.

+
+ + + + +
+ +

ahem

+ +

+ DEAR JUSTIN “TOTES ADORBZ” TRUDEAU
+ (and everyone else around the world pushing for voting reform) +

+ +

Thank you for taking this small but powerful first step! We've known for way too long that our current voting method – First Past The Post – forces voters to be dishonest, creates a polarizing "lesser of two evils" scenario, and screws over both major and minor candidates.

+ +

+ However, you're probably only considering Instant Runoff Voting. + Which, to be fair, is better than than First Past The Post, + and if it's a choice between just those two, definitely go for Instant Runoff. + But IRV still has a glitch as undemocratic as FPTP's – + and worse, in our age of distrust, Instant Runoff's lack of transparency may be deadly for democracy. + Yes, sure, IRV was the best voting method we could come up with... + in 1870. + And since then, IRV has dominated the conversation, + unwittingly framing the whole voting reform debate as “simple vs expressive”. +

+ +

+ But that is a false choice. Thanks to computer simulations, real-life studies, and a bunch of math nerds, + we now know of voting methods that are both simple and expressive. +

+ +

+ Personally, I'm leaning towards Score Voting. + It's simple, very expressive, and already familiar to anyone who's seen Amazon's or Yelp's “five star” review method. + But that's just my humble opinion. + You could also make the case that Approval Voting is more practical, + because it's even simpler, and would already work with existing voting machines! + All you'd need to do is change the instructions from + “vote for the candidate you like” to “vote for the candidates you like”. +

+ +

+ Or maybe I'm completely wrong about Instant Runoff Voting, and it's actually pretty okay. + Heck, you could even go for Borda Count, as a hilarious prank. +

+ +

I won't claim to know which voting method is The Best™. I shall keep open this discussion, just as long as we have this discussion. For three reasons:

+ +

1) If I claim one voting method is the best, end of story, all the social-choice-theory nerds will be on my butt, yelling, BUT NICKY WHAT ABOUT QUADRATIC VOTE BUYING

+ +

2) We still need to test these alternative voting methods with actual experience, + not just annoying internet flame wars between IRV advocates and Score Voting advocates theory. + All the more reason for small towns, local states, and nations like Canada to be pioneers, to bravely experiment!

+ +

3) Keeping the discussion going is what democracy is.

+ +

A recent study found that in many Western countries – from Sweden to Australia to the United States – support for democracy has plummeted over the last several generations. + In 2011, almost a full quarter of young Americans said democracy was a "bad" or "very bad" way to run a country. + And today, one in six Americans say it'd be "good" or "very good" to be under actual military rule. +

+ +

Our age of distrust goes a lot deeper than the technical details of a voting method. There isn't gonna be One Weird Trick to fix democracy. But as a first step, a low-hanging fruit, a way to show that, yes, you will make the method respond to the needs and wants and pains and hopes and dreams of your people – well, fixing our voting method's a good start as any.

+ +

Because, this isn't just about trying to build a better ballot.

+ +

This is about trying to build a better democracy.

+ +

<3,
+ ~ Nicky Case

+ +
+ +

P.S: Since you've read & played this all the way, here, have a bonus! + A “Sandbox Mode” of the election simulator, with up to five candidates. + You can also save & share your very own custom election scenario with others. Happy simulating!

+
+ + + + +
+
+

SANDBOX MODE! (link to just this)

+ +
+
+

+ One hope for Sandbox Mode is that readers can debate with me and each other using this tool! + Not just telling me I'm wrong, but showing me I'm wrong. + For example – + + here's a model I made in Sandbox Mode, + showing an interesting argument against Approval & Score Voting. + Granted, this tool is very limited – it doesn't handle strategic voting or imperfect information – + but I think it's a start, and may help improve our Democratic Discourse™ +

+
+
+ + + +
+
+ + +
+ +
+
PUBLIC DOMAIN
+ Zero rights reserved. + I'm giving away + all my art/code/words, + so that you + teachers, mathematicians, hobbyists, activists, and policy wonks + can use them however you like! + This is for you. + Get my source code on GitHub! +
+
+ +
+ + +
+ +
“BUT WHAT CAN I DO?”
+ +

+ For citizens: Remember, think global, but act local. + Change from the bottom-up lasts longer. + If you're in the US, + find your representative + and badger 'em. + If you're in Canada, + find your Member of Parliament + and badger 'em. + Also if you're Canadian, + fill out the MyDemocracy.ca survey before the end of 2016! + This survey has a few questions specifically about voting reform! + (sadly, the question is still framed as "simple vs expressive". + that is why i've been so gung-ho about Approval & Score, + and maybe a bit too mean towards IRV) +

+ +

+ For learners: + Watch CGP Grey's Politics in the Animal Kingdom series! + It's charming, and covers more ground than I did here – it explains + gerrymandering, proportional representation, and more. + Also, read Gaming The Vote by + William Poundstone. + It's a thrilling read, + with dramatic human stories of crooks & conmen trying to game our glitchy voting systems – + and sometimes, succeeding. +

+ +

+ For teachers: + This entire "explorable explanation" is public domain, copyright-free, + meaning you already have permission to use this freely in your classes! + You can even use the Sandbox Mode to create your own material, + or as a tool for students to make something on their own. +

+ +

+ For coders: + This is all open source! + So you can get my code on GitHub, and remix it to your heart's content. + (sorry in advance for my messy code) +

+ +

+ Check out these organizations: + Though they may differ on what voting method they like best, + they all have a common goal: to reform the one we have. + Electology likes Approval Voting most, + FairVote likes Instant Runoff most, + and RangeVoting.org likes Score Voting most. +

+ +
ON THE SHOULDERS OF GIANTS
+

+ This "explorable explanation" was directly inspired by these two projects: +

+ +

+ Voting Sim Visualization by Ka-Ping Yee (2005) + was a real eye-opener. + (hat tip to Bret Victor for sharing it with me!) + I've heard lots of written debate over FPTP vs IRV vs Condorcet vs Approval vs blah blah blah, + but I'd never seen their difference visualized so clearly! + It gave me instant insight. + And it actually changed my mind – I used to think IRV was pretty good, + but after seeing IRV's messiness (as shown above), I realized it's actually kinda stinky cheese. +

+

+ However, even this brilliant visualization was still too abstract. + And since it wasn't interactive, I couldn't test the many questions & scenarios that came to mind. + So that's why my second inspiration was... +

+ +

+ Up and Down the Ladder of Abstraction + by Bret Victor (2011). + It's one of the web's earliest "explorable explanations" (also a term Bret coined) + and it is gorgeous. + Obviously, I borrowed the format of mixing words & "games" to explain things, + but I also followed the formula of starting concrete – one voter – + then moving up to the more abstract – a whole election. +

+

+ + You can learn more about Explorable Explanations here. +

+

+ And last but not least, thank you to all the math & policy nerds + who spent way too much time thinking about all this. +

+ +
+ STAY IN TOUCH, MAYBE?
+

+ Every once in a while, I'll fall into an endless rabbithole – + like this one on voting methods – and slowly crawl my way out, bloodied and bruised, + with a new interactive thing for you! + If you wanna find out + when I finally get around to making new shtuff, you can... +

+ +

+ And if you wanna see more of my past projects, + check out my wobsite! +

+

+ See you again soon! Have a Happy New Year 2017, or try to, anyway. +

+ +
+ + +
+
A BIG THANKS TO ALL MY
+
SUPPORTERS
+ + + +
+
aimee jarboe
+
frank leon rose
+
jared cosulich
+
louis-jean teitelbaum
+
matt hughes
+
micah cowan
+
michael alan huff
+
natalie sun
+
noel lehmann
+
phil dougherty
+
tom cascio
+
tom knowles
+
+
+
+
+ Adam M. Smith
+ Alex Dytrych
+ Andrew
+ Andy
+ Artemiy Solopov
+ Aschelon
+ ben fei
+ Benjamin Riggs
+ Bob Wise
+ Brandon
+ Brent Werness
+ Brian Wu
+ Bruno Guerrero
+ Buster Benson
+ Casey Ross
+ Charlie McIlwain
+ Christopher
+ Colin
+ Colin
+ Cort Stratton
+ Craig Steele
+ Daniel Horowitz
+ Daniel Shiffman
+ Dave Tu
+ David Smit
+ Dylan Meconis
+ Fahrstuhl
+ Feiya Wang
+ Forrest Oliphant
+ Frank Leon Rose
+ Henry Reich
+ Iñaki
+ J. Hu
+ Jacob Christian Munch-Andersen
+ Jacques Frechet
+ James Hogan
+ Janusz Leidgens
+ John_Ca
+ Johnny Owens
+ Joseph Perry
+ Joshua Horowitz
+ Julia Karmo
+ Karen Cooper
+ Kat Suricata
+ Kate Fractal
+ Kathryn Long
+ Kevin
+ Kevin Wang
+
+
+ Klemen Slavic
+ kuerqing1024
+ Linda Booth Sweeney
+ Maic Lopez Saenz
+ Matt "Kupo" Roszak
+ Matt Warren
+ May-Li Khoe
+ Mekki MacAulay
+ Micah Cowan
+ Michael Duke
+ Michelle Brown
+ Michelle Kelly
+ Milan Pingel
+ Monika Denes
+ Mustafa Alic
+ Nick Schrag
+ Nikita
+ Noah Swartz
+ Pablo Lopez Soriano
+ Pat Mächler
+ Peter McEvoy
+ Philip Tibitoski
+ Piotr Migdal
+ Rachel Nabors
+ Raphael D'Amico
+ Richard Hackathorn
+ Rob Napier
+ Roland Tanglao
+ Ryan Barker
+ Sam Anderson
+ Sam Maynard
+ Samira Nedungadi
+ Sarah Barbour
+ sarah mathys
+ SB Sigma
+ Seanny123
+ Serguei Filimonov
+ Sigpipe
+ Sylvain Francis
+ Syria Carys Sirlay
+ T_Caramel
+ TisGood
+ Tony Onodi
+ Traci Lawson
+ Yona
+ Yu-Han Kuo
+ Zach Smith
+ Zoe Bogner +
+
+
+
AND SPECIAL THANKS TO
+
+
+ Alex Dytrych
+ Alex Jaffe
+ Brian Bucklew
+ Chris Walker
+ Christine Zhang
+ Dan Zajdband
+ Daniel Cook
+ Droqen
+ Jason Grinblat
+
+
+ Jessie Salz
+ Lisa Charlotte Rost
+ Martin Shelton
+ Patrick Dubroy
+ Pietro Passarelli
+ Sandhya Kambhampati
+ Tanya Short
+
+
+
+
+ +
+
+ sharing is caring! + +
+
+ +
+ + + + From 5344b0a54edd0f70335ffd23b4ab4e98113bf548 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Thu, 10 Aug 2017 19:56:57 -0400 Subject: [PATCH 072/120] added presets (phase 1) --- play/js/main_sandbox.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 51b85b0e..fb1f0eb0 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -604,6 +604,30 @@ function main(config){ choosegearconfig.dom.hidden = true document.querySelector("#left").insertBefore(choosegearconfig.dom,doms["systems"]); + + var presetnames = [] + var presethtmlnames = [] + var presetdescription = [] + for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} + for (var i=1;i<=14;i++) {presetnames.push("e"+i) ; presethtmlnames.push("election"+i+".html") ; presetdescription.push("election"+i+".html")} + + var presetconfig = [] + for (i in presetnames) presetconfig.push({name:presetnames[i],realname:presetdescription[i],htmlname:presethtmlnames[i],margin:4}) + + var onChoosepresetconfig = function(data){ + if (data.isOn) { + document.location.replace(data.htmlname); + } + }; + window.choosepresetconfig = new ButtonGroup({ + label: "pick a preset:", + width: 38, + data: presetconfig, + onChoose: onChoosepresetconfig, + isCheckbox: true + }); + choosepresetconfig.dom.hidden = true + document.querySelector("#left").insertBefore(choosepresetconfig.dom,doms["systems"]); // gear button (combines with above) @@ -611,8 +635,10 @@ function main(config){ var onChoosegearicon = function(data){ if (data.isOn) { choosegearconfig.dom.hidden = false + choosepresetconfig.dom.hidden = false } else { choosegearconfig.dom.hidden = true + choosepresetconfig.dom.hidden = true } }; window.choosegearicon = new ButtonGroup({ From ae1b52d347f6fc68615166365844aa81b6bbd7cb Mon Sep 17 00:00:00 2001 From: Paretoman Date: Thu, 10 Aug 2017 20:47:27 -0400 Subject: [PATCH 073/120] trying to figure out how to reload all the --- play/js/main_sandbox.js | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index fb1f0eb0..4f947c11 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -32,6 +32,15 @@ function main(config){ config.frontrunnerSet = new Set(config.afrontrunnerArray) // stringify a set is not good } + + var initialConfig + var allnames = ["systems","voters","candidates","strategy","percentstrategy","unstrategic","frontrunners","poll","yee"] + var doms = {} // for hiding menus, later + var stratsliders = [] // for hiding sliders, later + + var loadDefaults = function() { + + // Defaults... config = config || {}; config.system = config.system || "FPTP"; @@ -50,9 +59,6 @@ function main(config){ if (config.doPercentFirst) config.featurelist = config.featurelist.concat(["percentstrategy"]); config.doFullStrategyConfig = config.doFullStrategyConfig || false; if (config.doFullStrategyConfig) config.featurelist = config.featurelist.concat(["strategy","percentstrategy","unstrategic","frontrunners","poll","yee"]) - var allnames = ["systems","voters","candidates","strategy","percentstrategy","unstrategic","frontrunners","poll","yee"] - var doms = {} // for hiding menus, later - var stratsliders = [] // for hiding sliders, later // clear the grandfathered config settings config.doPercentFirst = undefined config.features = undefined @@ -74,8 +80,10 @@ function main(config){ config.unstrategic = config.unstrategic || "zero strategy. judge on an absolute scale."; config.keyyee = config.keyyee || "off"; config.afrontrunnerArray = Array.from(config.frontrunnerSet)// stringify a set is not good - var initialConfig = JSON.parse(JSON.stringify(config)); + initialConfig = JSON.parse(JSON.stringify(config)); + } // not indented + loadDefaults() Loader.onload = function(){ //////////////////////// @@ -605,6 +613,13 @@ function main(config){ document.querySelector("#left").insertBefore(choosegearconfig.dom,doms["systems"]); +var loadpreset = function(htmlname) { + if (htmlname == "election1.html") { + config = {system: "Plurality"} + } + return config +} + var presetnames = [] var presethtmlnames = [] var presetdescription = [] @@ -616,7 +631,16 @@ function main(config){ var onChoosepresetconfig = function(data){ if (data.isOn) { - document.location.replace(data.htmlname); + if (0) { + document.location.replace(data.htmlname); + } else { + config = loadpreset(data.htmlname) + loadDefaults() + model.reset(true); + model.onInit(); + setInPosition(); + selectUI(); + } } }; window.choosepresetconfig = new ButtonGroup({ From fa57b3d9f2612af61b055d839b566f6708269183 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Thu, 10 Aug 2017 21:14:26 -0400 Subject: [PATCH 074/120] works --- play/js/Presets.js | 55 +++++++++++++++++++++++++++++++++++++++++ play/js/main_sandbox.js | 11 +-------- sandbox/sandbox.html | 1 + 3 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 play/js/Presets.js diff --git a/play/js/Presets.js b/play/js/Presets.js new file mode 100644 index 00000000..2fc6519c --- /dev/null +++ b/play/js/Presets.js @@ -0,0 +1,55 @@ +var loadpreset = function(htmlname) { + if (htmlname == "election1.html") { + config = { + + system: "FPTP", + + candidates: 3, + candidatePositions: [[50,125],[250,125],[280,280]], + + voters: 1, + voterPositions: [[155,125]] + +} + } else if (htmlname == "election2.html") { + config = { + + features:1, + system: "IRV", + + candidates: 3, + candidatePositions: [[41,271],[257,27],[159,65]], + + voters: 1, + voterPositions: [[257,240]] + +} + } else if (htmlname == "election3.html") { + config = { + + features:1, + + system: "Borda", + + candidates: 3, + candidatePositions: [[173,150],[275,150],[23,150]], + //candidates: 4, + //candidatePositions: [[174,175],[271,266],[23,149],[23,23]], + + voters: 1, + voterPositions: [[232,150]] + // voterPositions: [[226,230]] + +} + } else if (htmlname == "election4.html") { + config = { + features:2, + system: "Condorcet", + candidates: 3, + voters: 3 +} + } else if (htmlname == "election.html") { + config = {} + } + return config +} diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 4f947c11..3d1c258e 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -611,14 +611,6 @@ function main(config){ }); choosegearconfig.dom.hidden = true document.querySelector("#left").insertBefore(choosegearconfig.dom,doms["systems"]); - - -var loadpreset = function(htmlname) { - if (htmlname == "election1.html") { - config = {system: "Plurality"} - } - return config -} var presetnames = [] var presethtmlnames = [] @@ -647,8 +639,7 @@ var loadpreset = function(htmlname) { label: "pick a preset:", width: 38, data: presetconfig, - onChoose: onChoosepresetconfig, - isCheckbox: true + onChoose: onChoosepresetconfig }); choosepresetconfig.dom.hidden = true document.querySelector("#left").insertBefore(choosepresetconfig.dom,doms["systems"]); diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index 4829bc80..4dfc4c50 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -25,6 +25,7 @@ + - \ No newline at end of file + \ No newline at end of file diff --git a/play/election10.html b/play/election10.html index 6ef0be5f..07f5183e 100644 --- a/play/election10.html +++ b/play/election10.html @@ -25,46 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election11.html b/play/election11.html index 201e6579..07f5183e 100644 --- a/play/election11.html +++ b/play/election11.html @@ -25,47 +25,4 @@ - + \ No newline at end of file diff --git a/play/election12.html b/play/election12.html index 43b693b0..07f5183e 100644 --- a/play/election12.html +++ b/play/election12.html @@ -25,45 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election13.html b/play/election13.html index 2e5a0692..07f5183e 100644 --- a/play/election13.html +++ b/play/election13.html @@ -25,45 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election14.html b/play/election14.html index e9152869..ced708ab 100644 --- a/play/election14.html +++ b/play/election14.html @@ -24,46 +24,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/play/election2.html b/play/election2.html index 095ead1b..07f5183e 100644 --- a/play/election2.html +++ b/play/election2.html @@ -25,17 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election3.html b/play/election3.html index 1e45947a..07f5183e 100644 --- a/play/election3.html +++ b/play/election3.html @@ -25,21 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election4.html b/play/election4.html index 877cf078..07f5183e 100644 --- a/play/election4.html +++ b/play/election4.html @@ -25,11 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election5.html b/play/election5.html index 276712b3..07f5183e 100644 --- a/play/election5.html +++ b/play/election5.html @@ -25,17 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election6.html b/play/election6.html index 67a3d27d..07f5183e 100644 --- a/play/election6.html +++ b/play/election6.html @@ -25,17 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election7.html b/play/election7.html index 4aab87a7..07f5183e 100644 --- a/play/election7.html +++ b/play/election7.html @@ -25,19 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election8.html b/play/election8.html index 59a13efb..07f5183e 100644 --- a/play/election8.html +++ b/play/election8.html @@ -25,40 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/election9.html b/play/election9.html index 689c46ef..07f5183e 100644 --- a/play/election9.html +++ b/play/election9.html @@ -25,20 +25,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/js/Presets.js b/play/js/Presets.js index 2fc6519c..6dde8125 100644 --- a/play/js/Presets.js +++ b/play/js/Presets.js @@ -48,8 +48,336 @@ var loadpreset = function(htmlname) { candidates: 3, voters: 3 } - } else if (htmlname == "election.html") { - config = {} + } else if (htmlname == "election5.html") { + config = +{ + + features:2, + system: "Borda", + + candidates: 3, + candidatePositions: [[40,115+10],[177,185+10],[224,118+10]], + + voters: 2, + voterPositions: [[75,120+10],[225,120+10]] + +} + } else if (htmlname == "election6.html") { + config = { + + system: "Score", + strategy: "normalize", + + candidates: 3, + candidatePositions: [[50,125],[250,125],[280,280]], + + voters: 1, + voterPositions: [[155,125]] + +} + } else if (htmlname == "election7.html") { + config = +{ + featurelist: ["percentstrategy"], + voterPercentStrategy: [100,0,0], + + system: "Score", + + candidates: 3, + candidatePositions: [[150-30,150],[150+130,150],[150+50,150]], + + voters: 1, + voterPositions: [[150,150]], + voterStrategies: ["normalize"] + +} + } else if (htmlname == "election8.html") { + config = +{ + + /* + features:3, + system: "Score", + + candidates: 3, + candidatePositions: [[100,150],[150,150+100],[300-100,150]], + + voters: 2, + voterPositions: [[100,150],[300-100,150]], + voterStrategies: ["normalize","zero strategy. judge on an absolute scale."], + frontrunnerSet: new Set(["square","hexagon"]) + */ + +candidatePositions: [[50,150],[250,150]], +voterPositions: [[100,150],[200,150]], +system: "Score", +candidates: 2, +voters: 2, +voterStrategies: ["normalize","normalize","zero strategy. judge on an absolute scale."], +frontrunnerSet: new Set(["square","hexagon"]), +featurelist: ["percentstrategy"], +sandboxsave: false, +hidegearconfig: false, +description: "", +voterPercentStrategy: ["70","49",0], +snowman: false, +unstrategic: "zero strategy. judge on an absolute scale.", +keyyee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined, + +} + } else if (htmlname == "election9.html") { + config = +{ + + features:3, + doPercentFirst:true, + system: "Score", + + candidates: 3, + + voters: 2, + voterPositions: [[200,160],[100,160]], + voterStrategies: ["normalize","normalize"], + voterPercentStrategy: [50,50], + doFullStrategyConfig: true + +} + } else if (htmlname == "election10.html") { + config = +{ +/* + features:3, + doPercentFirst:true, + system: "Approval", + + candidates: 3, + candidatePositions: [[150-25,150-20], + [150+20,150-20], + [150,150+75]], + + voters: 3, + voterPositions: [[150,150-70], + [150,150+10], + [150,150+90]], + voterStrategies: ["normalize frontrunners only","normalize frontrunners only","normalize frontrunners only"], + voterPercentStrategy: [100,100,100], + frontrunnerSet: new Set(['square','triangle','hexagon']), + doFullStrategyConfig: true + */ + +candidatePositions: [[121,149],[118,170],[194,159]], +voterPositions: [[116,121],[116,184],[195,155]], +system: "Approval", +candidates: 3, +voters: 3, +voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], +voterPercentStrategy: ["100","100",100], +frontrunnerSet: new Set(["square","triangle","hexagon"]), +featurelist: ["percentstrategy"], +sandboxsave: false, +hidegearconfig: false, +description: "", +snowman: true, +unstrategic: "normalize", +keyyee: "off", +kindayee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined +} + } else if (htmlname == "election11.html") { + config = +{ +/* + features:1, + doPercentFirst:true, + system: "Approval", + + candidates: 3, + candidatePositions: [[150-25,150-20], + [150+20,150-20], + [150,150+75]], + + voters: 3, + voterPositions: [[150,150-70], + [150,150+10], + [150,150+90]], + voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], + voterPercentStrategy: [0,100,100], + frontrunnerSet: new Set(['square','triangle','hexagon']), + doFullStrategyConfig: true, + unstrategic: "normalize" + */ + +candidatePositions: [[121,149],[118,170],[194,159]], +voterPositions: [[116,121],[116,184],[195,155]], +system: "Approval", +candidates: 3, +voters: 3, +voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], +voterPercentStrategy: ["100","100",100], +frontrunnerSet: new Set(["square","triangle","hexagon"]), +featurelist: ["percentstrategy"], +sandboxsave: false, +hidegearconfig: false, +description: "", +snowman: true, +unstrategic: "normalize", +keyyee: "off", +kindayee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined +} + } else if (htmlname == "election12.html") { + config = +{ +/* + features:3, + doPercentFirst:true, + system: "IRV", + + candidates: 4, + candidatePositions: [[150-25,150-20], + [150+20,150-20], + [150,150+75], + [150+0,150+10]], + + voters: 3, + voterPositions: [[150,150-70], + [150,150+10], + [150,150+90]], + voterStrategies: ["normalize frontrunners only","normalize frontrunners only","normalize frontrunners only"], + voterPercentStrategy: [100,100,100], + frontrunnerSet: new Set(['square','triangle','hexagon']) + */ + +candidatePositions: [[145,155],[184,153],[106,157]], +voterPositions: [[150,150]], +system: "IRV", +candidates: 3, +voters: 1, +voterStrategies: ["zero strategy. judge on an absolute scale.","normalize frontrunners only","normalize frontrunners only"], +voterPercentStrategy: ["100",100,100], +frontrunnerSet: new Set(["square","triangle","hexagon"]), +featurelist: ["systems"], +sandboxsave: false, +hidegearconfig: false, +description: "", +snowman: false, +unstrategic: "zero strategy. judge on an absolute scale.", +keyyee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined, +} + } else if (htmlname == "election13.html") { + config = +{ +/* + features:3, + doPercentFirst:true, + system: "STAR", + + candidates: 3, + candidatePositions: [[150-25,150-20], + [150+20,150-20], + [150,150+75]], + + voters: 3, + voterPositions: [[150,150-70], + [150,150+10], + [150,150+90]], + voterStrategies: ["starnormfrontrunners","starnormfrontrunners","starnormfrontrunners"], + voterPercentStrategy: [100,100,100], + frontrunnerSet: new Set(['square','triangle','hexagon']) + */ + +candidatePositions: [[121,149],[118,170],[194,159]], +voterPositions: [[116,121],[116,184],[195,155]], +system: "STAR", +candidates: 3, +voters: 3, +voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], +voterPercentStrategy: ["100","100",100], +frontrunnerSet: new Set(["square","triangle","hexagon"]), +featurelist: ["percentstrategy"], +sandboxsave: false, +hidegearconfig: false, +description: "", +snowman: true, +unstrategic: "normalize", +keyyee: "off", +kindayee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined +} + } else if (htmlname == "election14.html") { + config = +{ +/* + features:3, + doPercentFirst:true, + system: "3-2-1", + + candidates: 3, + candidatePositions: [[150-25,150-20], + [150+20,150-20], + [150,150+75]], + + voters: 3, + voterPositions: [[150,150-70], + [150,150+10], + [150,150+90]], + voterStrategies: ["starnormfrontrunners","starnormfrontrunners","starnormfrontrunners"], + voterPercentStrategy: [100,100,100], + frontrunnerSet: new Set(['square','triangle','hexagon']) + */ + +candidatePositions: [[121,149],[118,170],[194,159]], +voterPositions: [[116,121],[116,184],[195,155]], +system: "3-2-1", +candidates: 3, +voters: 3, +voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], +voterPercentStrategy: ["100","100",100], +frontrunnerSet: new Set(["square","triangle","hexagon"]), +featurelist: ["percentstrategy"], +sandboxsave: false, +hidegearconfig: false, +description: "", +snowman: true, +unstrategic: "normalize", +keyyee: "off", +kindayee: "off", +features: undefined, +doPercentFirst: undefined, +doFullStrategyConfig: undefined +} + } else if (htmlname == "sandbox.html") { + config = +{ + description: "[type a description for your model here. for example...]\n\nLook, it's the whole shape gang! Steven Square, Tracy Triangle, Henry Hexagon, Percival Pentagon, and last but not least, Bob.", + features: 4, + system: "FPTP", + candidates: 5, + voters: 1, + doFullStrategyConfig: true, + doPercentFirst: true +} + // } else if (htmlname == "election.html") { + // config = + + } return config } + + +var url = window.location.pathname; +var filename = url.substring(url.lastIndexOf('/')+1); +main(loadpreset(filename)); diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 7a6b6ec6..5857a665 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -611,26 +611,38 @@ function main(config){ choosegearconfig.dom.hidden = true document.querySelector("#left").insertBefore(choosegearconfig.dom,doms["systems"]); - var presetnames = [] - var presethtmlnames = [] - var presetdescription = [] - for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} + // get current filename, in order to go back to the original intended preset + var url = window.location.pathname; + var filename = url.substring(url.lastIndexOf('/')+1); + main(loadpreset(filename)); + + var presetnames = ["O"] + var presethtmlnames = [filename] + var presetdescription = ["original intended preset"] + + // and fill in the rest for (var i=1;i<=14;i++) {presetnames.push("e"+i) ; presethtmlnames.push("election"+i+".html") ; presetdescription.push("election"+i+".html")} + // TODO + //for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} + + + var presetconfig = [] for (i in presetnames) presetconfig.push({name:presetnames[i],realname:presetdescription[i],htmlname:presethtmlnames[i],margin:4}) var onChoosepresetconfig = function(data){ if (data.isOn) { - if (0) { - document.location.replace(data.htmlname); - } else { + var firstletter = data.htmlname[0] + if (firstletter == 'e') { config = loadpreset(data.htmlname) loadDefaults() model.reset(true); model.onInit(); setInPosition(); selectUI(); + } else if (firstletter == 'b') { + document.location.replace(data.htmlname); } } }; diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index 4dfc4c50..d2342fad 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -25,17 +25,6 @@ - - - \ No newline at end of file + \ No newline at end of file From 6f3f088b642f04e76644994e5b9e605b24b70f85 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Thu, 10 Aug 2017 23:44:49 -0400 Subject: [PATCH 077/120] small fix --- play/js/Presets.js | 2 +- play/js/main_sandbox.js | 8 ++++---- sandbox/sandbox.html | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/play/js/Presets.js b/play/js/Presets.js index 6dde8125..fb88144a 100644 --- a/play/js/Presets.js +++ b/play/js/Presets.js @@ -220,7 +220,7 @@ voters: 3, voterStrategies: ["best frontrunner","best frontrunner","best frontrunner"], voterPercentStrategy: ["100","100",100], frontrunnerSet: new Set(["square","triangle","hexagon"]), -featurelist: ["percentstrategy"], +featurelist: ["percentstrategy","systems"], sandboxsave: false, hidegearconfig: false, description: "", diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 5857a665..41ee9252 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -20,7 +20,7 @@ function main(config){ results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, " ")); + return decodeURIComponent(results[2].replace(/\+/g, " ")).replace("}/","}"); //not sure how that / got there. }; var modelData = _getParameterByName("m"); if(modelData){ @@ -616,9 +616,9 @@ function main(config){ var filename = url.substring(url.lastIndexOf('/')+1); main(loadpreset(filename)); - var presetnames = ["O"] - var presethtmlnames = [filename] - var presetdescription = ["original intended preset"] + var presetnames = ["O","SA"] + var presethtmlnames = [filename,"sandbox.html"] + var presetdescription = ["original intended preset","sandbox"] // and fill in the rest for (var i=1;i<=14;i++) {presetnames.push("e"+i) ; presethtmlnames.push("election"+i+".html") ; presetdescription.push("election"+i+".html")} diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index d2342fad..1b0974c7 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -26,5 +26,5 @@ - \ No newline at end of file From 5ada4291c158e16748a21d876c0751434e2d46f1 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 11 Aug 2017 13:01:33 -0400 Subject: [PATCH 078/120] kinda slow, but it's at least connected. it isn't using the combineKernels, which it should. --- play/js/FastYee.1.js | 706 ++ play/js/FastYee.2.js | 703 ++ play/js/FastYee.js | 726 ++ play/js/Model.js | 91 + play/js/gpu.js-develop/bin/gpu-core.js | 209 + play/js/gpu.js-develop/bin/gpu-core.min.js | 15 + play/js/gpu.js-develop/bin/gpu.js | 6984 ++++++++++++++++++++ play/js/gpu.js-develop/bin/gpu.min.js | 19 + sandbox/sandbox.html | 5 + 9 files changed, 9458 insertions(+) create mode 100644 play/js/FastYee.1.js create mode 100644 play/js/FastYee.2.js create mode 100644 play/js/FastYee.js create mode 100644 play/js/gpu.js-develop/bin/gpu-core.js create mode 100644 play/js/gpu.js-develop/bin/gpu-core.min.js create mode 100644 play/js/gpu.js-develop/bin/gpu.js create mode 100644 play/js/gpu.js-develop/bin/gpu.min.js diff --git a/play/js/FastYee.1.js b/play/js/FastYee.1.js new file mode 100644 index 00000000..0af957a8 --- /dev/null +++ b/play/js/FastYee.1.js @@ -0,0 +1,706 @@ +// use the functions +// cubeCandidateToWinner +// cubeVoterToWinner +// to get a list of winners +// The input is which object to move, +// what the current object positions are, and +// what the pixel size and number of pixels vertical and horizontal + +// function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +// function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ + + +runscript = false +var onlylast = true +docubevc = true + +// const has a local scope inside any braces, so since we are doing this if(runscript) thing, we need to have const defined outside the block +var gpu,d,cubeVoter,cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner,superKernel,superKernel2,superKernelCandidate,superKernelVoter,cube3 + +if(runscript){ + +var left = document.getElementById('left') +var right = document.getElementById('right') +} +gpu = new GPU(); + +if(runscript){ + +left.innerHTML += gpu.getMode() +left.innerHTML += 'left is gpu output. right is true values.' +right.innerHTML += gpu.getMode() +right.innerHTML += 'left is gpu output. right is true values.' + + + + +// i is instances +// v is voters +// c is candidates +// l is a prefix for length of array + +// there are three constructors here to make the datasets. +// 1. random voter and candidate positions +// 2. raster a group of voters +// 3. raster a candidate + +// make variables + +var lc = 5 +var lv = 2 +var li = 10 // 400 +var xf = [] +for (i =0;i> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d = Math.sqrt(dx*dx + dy*dy) + return d +}, { + dimensions: [lv*lc*li], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + + +if(runscript){ + +var cube = d(xv, yv, xf, yf) +//left.innerHTML += "
"+cube + +left.innerHTML += "
"+"cube" +left.innerHTML += "
"+cube.slice(0,100).join("
") +right.innerHTML += "
"+"cube" +} +function dJ(xv,yv,xf,yf,lc,li,lv) { +cube=[] +for (var civ=0; civ> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d2 = Math.sqrt(dx*dx + dy*dy) + right.innerHTML += "
"+d2 + cube.push(d2) +} +return cube +} + +if(runscript){ + +cube = dJ(xv,yv,xf,yf,lc,li,lv) + +} + + + +if(docubevc) { + + + + +if(runscript){ + +// make grid of instances, i +WIDTH = 300 +HEIGHT = 300 +pixelsize = 30 +lix = WIDTH / pixelsize // called density +liy = HEIGHT / pixelsize +li = lix * liy + + + + + + + + + + +var xc=xf +var yc=yf + + +votergrouptomove = 0 // edit this +vg = [] // which group does the voter belong to? +nvg = 3 // how many voter groups are there? +for (j =0;j") + + + + + + + + +candidatetomove = 0 // edit this + +var notcandidatetomove = [] +var boolcanmove = [] +for (i =0;i") + + +} + +} +minCube = gpu.createKernel( function(d) { + var iv,civ,n,d1 + iv = this.thread.x + + n=1000 + for (var c = 0; c < lc; c++) { + civ = c + iv* lc + // d1 = d[c][i][v] // d at x,y,z + //(z * xMax * yMax) + (y * xMax) + x; + + d1 = d[civ] + if (d1 < n) { + n = d1 //min + } + } + return n +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var min = minCube(cube).slice(0,lv*li) // weird. we need to slice because there is something weird going on with the output dimensions +left.innerHTML += "
"+"min" +left.innerHTML += "
"+min.slice(0,100).join("
") +right.innerHTML += "
"+"min" +} +function minCubeJ(d,lc,li,lv) { +min=[] +for (var iv=0; iv m) { + m = d1 //max + } + } + return m +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var max = maxCube(cube).slice(0,lv*li) +left.innerHTML += "
"+"max" +left.innerHTML += "
"+max.slice(0,100).join("
") + +right.innerHTML += "
"+"max" +} +function maxCubeJ(d,lc,li,lv){ +max=[] +for (var iv=0; iv m) { + m = d1 //min + } + } + right.innerHTML += "
"+m + max.push(m) +} +return max +} +if(runscript){ + +max = maxCubeJ(cube,lc,li,lv) +} + + +doFnorm = gpu.createKernel(function(m,n) { + var iv = this.thread.x + var fnorm + //fnorm = (m[iv]-n[iv]) + fnorm = 1/ (m[iv]-n[iv]) + return fnorm +}, { + dimensions: [li*lv*lc], +}) +if(runscript){ + +var fnormdone = doFnorm(max,min).slice(0,li*lv) + + +left.innerHTML += "
"+"fnorm" +left.innerHTML += "
"+fnormdone.slice(0,100).join("
") + +right.innerHTML += "
"+"fnorm" +} +function doFnormJ(min,max,lc,li,lv) { +fnormdone=[] +for (var iv=0; iv") + +right.innerHTML += "
"+"scores" +maxscore=5 +minscore=0 +} +function doScoresJ(cube,max,min,fnorm,lc,li,lv) { +scores=[] +for (var civ=0; civ") + +right.innerHTML += "
"+"tally" +} +function doTallyJ(scores,lc,li,lv){ +tally = [] +for (var ci = 0; ci< lc*li; ci++) { + + sum = 0 + for (var v = 0; v < lv; v++) { + civ = ci + v *lc*li + //civ = c + i *lc + v *lc*li + sum += scores[civ] + } + tally.push(sum) + right.innerHTML += "
"+sum +} +return tally +} +if(runscript){ + +tally = doTallyJ(scores,lc,li,lv) +} +findWinner = gpu.createKernel(function(tally) { + var i,ci,m,t1,mi + i = this.thread.x + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + return mi +}, { + dimensions: [li*lv*lc], + constants: {lv:lv,lc:lc,li:li} +}) +if(runscript){ + +var winner = findWinner(tally).slice(0,li) +left.innerHTML += "
"+"winner" +left.innerHTML += "
"+winner.join("
") + +right.innerHTML += "
"+"winner" +} +function findWinnerJ(tally,lc,li,lv){ +miset=[] +for (var i = 0; i < li; i++) { + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + right.innerHTML += "
"+mi + miset.push(mi) +} +return miset +} +if(runscript){ + +miset = findWinnerJ(tally,lc,li,lv) +} +if (!onlylast) { +superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xf,yf) { + var cube,min,max,fnorm,scores,tally,winner + cube = d(xv, yv, xf, yf) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + +if(runscript){ + +var winner = superKernel(xv,yv,xf,yf).slice(0,li); +left.innerHTML += "
"+"megawinner" +left.innerHTML += "
"+winner.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") + +// for ( var j=0;j<100;j++) { +// var winner = superKernel(xv,yv,xf,yf); +// left.innerHTML += "
"+winner[0]) +// } + +cube2 = d(xv, yv, xf, yf) +} +superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { + return findWinner(doTally(doScores(cube2,maxCube(cube2),minCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),5,0))) + }) + +if(runscript){ + +var winner2 = superKernel2(cube2).slice(0,li); +left.innerHTML += "
"+"megawinner2" +left.innerHTML += "
"+winner2.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} +} +// third try + +function cubeToWinner(xv,yv,xf,yf) { +cube3 = d(xv, yv, xf, yf) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + +if(runscript){ + +winner3 = cubeToWinner(xv,yv,xf,yf) + + + + + +left.innerHTML += "
"+"lessmegawinner3" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} + +function cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) { +cube3 = dJ(xv, yv, xf, yf,lc,li,lv) +min3 = minCubeJ(cube3,lc,li,lv) +max3 = maxCubeJ(cube3,lc,li,lv) +fnorm3 = doFnormJ(max3,min3,lc,li,lv) +scores3 = doScoresJ(cube3,max3,min3,fnorm3,5,0,lc,li,lv) + +tally3 = doTallyJ(scores3,lc,li,lv) +winner3 = findWinnerJ(tally3,lc,li,lv) +return winner3 +} + +if(runscript){ + +winner4 = cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) + +left.innerHTML += "
"+"lessmegawinner3 again" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner megaJ" +right.innerHTML += "
"+winner4.join("
") + + + +left.innerHTML += "
"+"done" +right.innerHTML += "
"+"done" + +} + +superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { + var cube,min,max,fnorm,scores,tally,winner + cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + + +superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { + var cube,min,max,fnorm,scores,tally,winner + cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + +function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +const cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + + + + + +function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + +function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,WIDTH,HEIGHT,density) { + pixelsize = density + lix = WIDTH / pixelsize // called density + liy = HEIGHT / pixelsize + if (whichtypetomove == "voter"){ + votergrouptomove = movethisidx + return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + // return superKernelCandidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + } else if (whichtypetomove == "candidate"){ + candidatetomove = movethisidx + return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + // return superKernelVoter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + } +} diff --git a/play/js/FastYee.2.js b/play/js/FastYee.2.js new file mode 100644 index 00000000..d37d8e0b --- /dev/null +++ b/play/js/FastYee.2.js @@ -0,0 +1,703 @@ +// use the functions +// cubeCandidateToWinner +// cubeVoterToWinner +// to get a list of winners +// The input is which object to move, +// what the current object positions are, and +// what the pixel size and number of pixels vertical and horizontal + +// function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +// function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ + + +runscript = false +var onlylast = true +docubevc = true + +if(runscript){ + +var left = document.getElementById('left') +var right = document.getElementById('right') +} +const gpu = new GPU(); + +if(runscript){ + +left.innerHTML += gpu.getMode() +left.innerHTML += 'left is gpu output. right is true values.' +right.innerHTML += gpu.getMode() +right.innerHTML += 'left is gpu output. right is true values.' + + + + +// i is instances +// v is voters +// c is candidates +// l is a prefix for length of array + +// there are three constructors here to make the datasets. +// 1. random voter and candidate positions +// 2. raster a group of voters +// 3. raster a candidate + +// make variables + +var lc = 5 +var lv = 2 +var li = 10 // 400 +var xf = [] +for (i =0;i> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d = Math.sqrt(dx*dx + dy*dy) + return d +}, { + dimensions: [lv*lc*li], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + + +if(runscript){ + +var cube = d(xv, yv, xf, yf) +//left.innerHTML += "
"+cube + +left.innerHTML += "
"+"cube" +left.innerHTML += "
"+cube.slice(0,100).join("
") +right.innerHTML += "
"+"cube" +} +function dJ(xv,yv,xf,yf,lc,li,lv) { +cube=[] +for (var civ=0; civ> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d2 = Math.sqrt(dx*dx + dy*dy) + right.innerHTML += "
"+d2 + cube.push(d2) +} +return cube +} + +if(runscript){ + +cube = dJ(xv,yv,xf,yf,lc,li,lv) + +} + + + +if(docubevc) { + + + + +if(runscript){ + +// make grid of instances, i +WIDTH = 300 +HEIGHT = 300 +pixelsize = 30 +lix = WIDTH / pixelsize // called density +liy = HEIGHT / pixelsize +li = lix * liy + + + + + + + + + + +var xc=xf +var yc=yf + + +votergrouptomove = 0 // edit this +vg = [] // which group does the voter belong to? +nvg = 3 // how many voter groups are there? +for (j =0;j") + + + + + + + + +candidatetomove = 0 // edit this + +var notcandidatetomove = [] +var boolcanmove = [] +for (i =0;i") + + +} + +} +const minCube = gpu.createKernel( function(d) { + var iv,civ,n,d1 + iv = this.thread.x + + n=1000 + for (var c = 0; c < lc; c++) { + civ = c + iv* lc + // d1 = d[c][i][v] // d at x,y,z + //(z * xMax * yMax) + (y * xMax) + x; + + d1 = d[civ] + if (d1 < n) { + n = d1 //min + } + } + return n +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var min = minCube(cube).slice(0,lv*li) // weird. we need to slice because there is something weird going on with the output dimensions +left.innerHTML += "
"+"min" +left.innerHTML += "
"+min.slice(0,100).join("
") +right.innerHTML += "
"+"min" +} +function minCubeJ(d,lc,li,lv) { +min=[] +for (var iv=0; iv m) { + m = d1 //max + } + } + return m +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var max = maxCube(cube).slice(0,lv*li) +left.innerHTML += "
"+"max" +left.innerHTML += "
"+max.slice(0,100).join("
") + +right.innerHTML += "
"+"max" +} +function maxCubeJ(d,lc,li,lv){ +max=[] +for (var iv=0; iv m) { + m = d1 //min + } + } + right.innerHTML += "
"+m + max.push(m) +} +return max +} +if(runscript){ + +max = maxCubeJ(cube,lc,li,lv) +} + + +const doFnorm = gpu.createKernel(function(m,n) { + var iv = this.thread.x + var fnorm + //fnorm = (m[iv]-n[iv]) + fnorm = 1/ (m[iv]-n[iv]) + return fnorm +}, { + dimensions: [li*lv*lc], +}) +if(runscript){ + +var fnormdone = doFnorm(max,min).slice(0,li*lv) + + +left.innerHTML += "
"+"fnorm" +left.innerHTML += "
"+fnormdone.slice(0,100).join("
") + +right.innerHTML += "
"+"fnorm" +} +function doFnormJ(min,max,lc,li,lv) { +fnormdone=[] +for (var iv=0; iv") + +right.innerHTML += "
"+"scores" +maxscore=5 +minscore=0 +} +function doScoresJ(cube,max,min,fnorm,lc,li,lv) { +scores=[] +for (var civ=0; civ") + +right.innerHTML += "
"+"tally" +} +function doTallyJ(scores,lc,li,lv){ +tally = [] +for (var ci = 0; ci< lc*li; ci++) { + + sum = 0 + for (var v = 0; v < lv; v++) { + civ = ci + v *lc*li + //civ = c + i *lc + v *lc*li + sum += scores[civ] + } + tally.push(sum) + right.innerHTML += "
"+sum +} +return tally +} +if(runscript){ + +tally = doTallyJ(scores,lc,li,lv) +} +const findWinner = gpu.createKernel(function(tally) { + var i,ci,m,t1,mi + i = this.thread.x + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + return mi +}, { + dimensions: [li*lv*lc], + constants: {lv:lv,lc:lc,li:li} +}) +if(runscript){ + +var winner = findWinner(tally).slice(0,li) +left.innerHTML += "
"+"winner" +left.innerHTML += "
"+winner.join("
") + +right.innerHTML += "
"+"winner" +} +function findWinnerJ(tally,lc,li,lv){ +miset=[] +for (var i = 0; i < li; i++) { + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + right.innerHTML += "
"+mi + miset.push(mi) +} +return miset +} +if(runscript){ + +miset = findWinnerJ(tally,lc,li,lv) +} +if (!onlylast) { +const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xf,yf) { + var cube,min,max,fnorm,scores,tally,winner + cube = d(xv, yv, xf, yf) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + +if(runscript){ + +var winner = superKernel(xv,yv,xf,yf).slice(0,li); +left.innerHTML += "
"+"megawinner" +left.innerHTML += "
"+winner.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") + +// for ( var j=0;j<100;j++) { +// var winner = superKernel(xv,yv,xf,yf); +// left.innerHTML += "
"+winner[0]) +// } + +cube2 = d(xv, yv, xf, yf) +} +const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { + return findWinner(doTally(doScores(cube2,maxCube(cube2),minCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),5,0))) + }) + +if(runscript){ + +var winner2 = superKernel2(cube2).slice(0,li); +left.innerHTML += "
"+"megawinner2" +left.innerHTML += "
"+winner2.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} +} +// third try + +function cubeToWinner(xv,yv,xf,yf) { +cube3 = d(xv, yv, xf, yf) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + +if(runscript){ + +winner3 = cubeToWinner(xv,yv,xf,yf) + + + + + +left.innerHTML += "
"+"lessmegawinner3" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} + +function cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) { +cube3 = dJ(xv, yv, xf, yf,lc,li,lv) +min3 = minCubeJ(cube3,lc,li,lv) +max3 = maxCubeJ(cube3,lc,li,lv) +fnorm3 = doFnormJ(max3,min3,lc,li,lv) +scores3 = doScoresJ(cube3,max3,min3,fnorm3,5,0,lc,li,lv) + +tally3 = doTallyJ(scores3,lc,li,lv) +winner3 = findWinnerJ(tally3,lc,li,lv) +return winner3 +} + +if(runscript){ + +winner4 = cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) + +left.innerHTML += "
"+"lessmegawinner3 again" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner megaJ" +right.innerHTML += "
"+winner4.join("
") + + + +left.innerHTML += "
"+"done" +right.innerHTML += "
"+"done" + +} + +const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { + var cube,min,max,fnorm,scores,tally,winner + cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + + +const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { + var cube,min,max,fnorm,scores,tally,winner + cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + +function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +const cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + + + + + +function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + +function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,WIDTH,HEIGHT,density) { + pixelsize = density + lix = WIDTH / pixelsize // called density + liy = HEIGHT / pixelsize + if (whichtypetomove == "voter"){ + votergrouptomove = movethisidx + // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + return superKernelCandidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + } else if (whichtypetomove == "candidate"){ + candidatetomove = movethisidx + // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + return superKernelVoter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + } +} diff --git a/play/js/FastYee.js b/play/js/FastYee.js new file mode 100644 index 00000000..de317af0 --- /dev/null +++ b/play/js/FastYee.js @@ -0,0 +1,726 @@ +// use the functions +// cubeCandidateToWinner +// cubeVoterToWinner +// to get a list of winners +// The input is which object to move, +// what the current object positions are, and +// what the pixel size and number of pixels vertical and horizontal + +// function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +// function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ + + + + +// comment this out when running as a script + +function createKernelYee(lc,lv,WIDTH,HEIGHT,density) { + pixelsize = density + lix = WIDTH / pixelsize // called density + liy = HEIGHT / pixelsize + // set some globals + li = lix * liy +// this part + + + + +runscript = false +var onlylast = true +docubevc = true + +var li,lv,lc + +if(runscript){ + +var left = document.getElementById('left') +var right = document.getElementById('right') +} +const gpu = new GPU(); + +if(runscript){ + +left.innerHTML += gpu.getMode() +left.innerHTML += 'left is gpu output. right is true values.' +right.innerHTML += gpu.getMode() +right.innerHTML += 'left is gpu output. right is true values.' + + + + +// i is instances +// v is voters +// c is candidates +// l is a prefix for length of array + +// there are three constructors here to make the datasets. +// 1. random voter and candidate positions +// 2. raster a group of voters +// 3. raster a candidate + +// make variables + +var lc = 5 +var lv = 2 +var li = 10 // 400 +var xf = [] +for (i =0;i> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d = Math.sqrt(dx*dx + dy*dy) + return d +}, { + dimensions: [lv*lc*li], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + + +if(runscript){ + +var cube = d(xv, yv, xf, yf) +//left.innerHTML += "
"+cube + +left.innerHTML += "
"+"cube" +left.innerHTML += "
"+cube.slice(0,100).join("
") +right.innerHTML += "
"+"cube" +} +function dJ(xv,yv,xf,yf,lc,li,lv) { +cube=[] +for (var civ=0; civ> 0 + ci = civ - v * lc * li + //ci = civ % (lc*li) + i = Math.floor((ci) / lc) + //i = Math.floor(civ/lc)%li + //i = tmp / lc >> 0; // y + c = ci % lc; // x + //c=civ%lc + // d is indexed as civ + + dx = xv[i][v] - xf[c] + dy = yv[i][v] - yf[c] + d2 = Math.sqrt(dx*dx + dy*dy) + right.innerHTML += "
"+d2 + cube.push(d2) +} +return cube +} + +if(runscript){ + +cube = dJ(xv,yv,xf,yf,lc,li,lv) + +} + + + + + + + + +if(runscript){ + +// make grid of instances, i +WIDTH = 300 +HEIGHT = 300 +pixelsize = 30 +lix = WIDTH / pixelsize // called density +liy = HEIGHT / pixelsize +li = lix * liy + + + + + + + + + + +var xc=xf +var yc=yf + + +votergrouptomove = 0 // edit this +vg = [] // which group does the voter belong to? +nvg = 3 // how many voter groups are there? +for (j =0;j") + + + + + + + + +candidatetomove = 0 // edit this + +var notcandidatetomove = [] +var boolcanmove = [] +for (i =0;i") + + +} + + +const minCube = gpu.createKernel( function(d) { + var iv,civ,n,d1 + iv = this.thread.x + + n=1000 + for (var c = 0; c < lc; c++) { + civ = c + iv* lc + // d1 = d[c][i][v] // d at x,y,z + //(z * xMax * yMax) + (y * xMax) + x; + + d1 = d[civ] + if (d1 < n) { + n = d1 //min + } + } + return n +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var min = minCube(cube).slice(0,lv*li) // weird. we need to slice because there is something weird going on with the output dimensions +left.innerHTML += "
"+"min" +left.innerHTML += "
"+min.slice(0,100).join("
") +right.innerHTML += "
"+"min" +} +function minCubeJ(d,lc,li,lv) { +min=[] +for (var iv=0; iv m) { + m = d1 //max + } + } + return m +}, { + dimensions: [lv*li*lc], // y,x + constants: {lv:lv,lc:lc,li:li} +}) + +if(runscript){ + +var max = maxCube(cube).slice(0,lv*li) +left.innerHTML += "
"+"max" +left.innerHTML += "
"+max.slice(0,100).join("
") + +right.innerHTML += "
"+"max" +} +function maxCubeJ(d,lc,li,lv){ +max=[] +for (var iv=0; iv m) { + m = d1 //min + } + } + right.innerHTML += "
"+m + max.push(m) +} +return max +} +if(runscript){ + +max = maxCubeJ(cube,lc,li,lv) +} + + +const doFnorm = gpu.createKernel(function(m,n) { + var iv = this.thread.x + var fnorm + //fnorm = (m[iv]-n[iv]) + fnorm = 1/ (m[iv]-n[iv]) + return fnorm +}, { + dimensions: [li*lv*lc], +}) +if(runscript){ + +var fnormdone = doFnorm(max,min).slice(0,li*lv) + + +left.innerHTML += "
"+"fnorm" +left.innerHTML += "
"+fnormdone.slice(0,100).join("
") + +right.innerHTML += "
"+"fnorm" +} +function doFnormJ(min,max,lc,li,lv) { +fnormdone=[] +for (var iv=0; iv") + +right.innerHTML += "
"+"scores" +maxscore=5 +minscore=0 +} +function doScoresJ(cube,max,min,fnorm,lc,li,lv) { +scores=[] +for (var civ=0; civ") + +right.innerHTML += "
"+"tally" +} +function doTallyJ(scores,lc,li,lv){ +tally = [] +for (var ci = 0; ci< lc*li; ci++) { + + sum = 0 + for (var v = 0; v < lv; v++) { + civ = ci + v *lc*li + //civ = c + i *lc + v *lc*li + sum += scores[civ] + } + tally.push(sum) + right.innerHTML += "
"+sum +} +return tally +} +if(runscript){ + +tally = doTallyJ(scores,lc,li,lv) +} +const findWinner = gpu.createKernel(function(tally) { + var i,ci,m,t1,mi + i = this.thread.x + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + return mi +}, { + dimensions: [li*lv*lc], + constants: {lv:lv,lc:lc,li:li} +}) +if(runscript){ + +var winner = findWinner(tally).slice(0,li) +left.innerHTML += "
"+"winner" +left.innerHTML += "
"+winner.join("
") + +right.innerHTML += "
"+"winner" +} +function findWinnerJ(tally,lc,li,lv){ +miset=[] +for (var i = 0; i < li; i++) { + m = -1 + mi = -1 + for (var c = 0; c < lc; c++) { + ci = c + i * lc + t1 = tally[ci] + if(t1 > m) { + m = t1 + mi = c + } + } + right.innerHTML += "
"+mi + miset.push(mi) +} +return miset +} +if(runscript){ + +miset = findWinnerJ(tally,lc,li,lv) +} +if (!onlylast) { +const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xf,yf) { + var cube,min,max,fnorm,scores,tally,winner + cube = d(xv, yv, xf, yf) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) + + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) + +if(runscript){ + +var winner = superKernel(xv,yv,xf,yf).slice(0,li); +left.innerHTML += "
"+"megawinner" +left.innerHTML += "
"+winner.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") + +// for ( var j=0;j<100;j++) { +// var winner = superKernel(xv,yv,xf,yf); +// left.innerHTML += "
"+winner[0]) +// } + +cube2 = d(xv, yv, xf, yf) +} +const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { + return findWinner(doTally(doScores(cube2,maxCube(cube2),minCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),5,0))) + }) + +if(runscript){ + +var winner2 = superKernel2(cube2).slice(0,li); +left.innerHTML += "
"+"megawinner2" +left.innerHTML += "
"+winner2.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} +} +// third try + +function cubeToWinner(xv,yv,xf,yf) { +cube3 = d(xv, yv, xf, yf) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + +if(runscript){ + +winner3 = cubeToWinner(xv,yv,xf,yf) + + + + + +left.innerHTML += "
"+"lessmegawinner3" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner again" +right.innerHTML += "
"+miset.join("
") +} + +function cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) { +cube3 = dJ(xv, yv, xf, yf,lc,li,lv) +min3 = minCubeJ(cube3,lc,li,lv) +max3 = maxCubeJ(cube3,lc,li,lv) +fnorm3 = doFnormJ(max3,min3,lc,li,lv) +scores3 = doScoresJ(cube3,max3,min3,fnorm3,5,0,lc,li,lv) + +tally3 = doTallyJ(scores3,lc,li,lv) +winner3 = findWinnerJ(tally3,lc,li,lv) +return winner3 +} + +if(runscript){ + +winner4 = cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) + +left.innerHTML += "
"+"lessmegawinner3 again" +left.innerHTML += "
"+winner3.join("
") +right.innerHTML += "
"+"winner megaJ" +right.innerHTML += "
"+winner4.join("
") + + + +left.innerHTML += "
"+"done" +right.innerHTML += "
"+"done" + +} + +// const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { +// var cube,min,max,fnorm,scores,tally,winner +// cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) +// min = minCube(cube) +// max = maxCube(cube) +// fnorm = doFnorm(max,min) +// scores = doScores(cube,max,min,fnorm,5,0) + +// tally = doTally(scores) +// winner = findWinner(tally) +// return winner +// }) + + +// const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { +// var cube,min,max,fnorm,scores,tally,winner +// cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) +// min = minCube(cube) +// max = maxCube(cube) +// fnorm = doFnorm(max,min) +// scores = doScores(cube,max,min,fnorm,5,0) + +// tally = doTally(scores) +// winner = findWinner(tally) +// return winner +// }) + + +cubeCandidateToWinner = function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +const cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 +} + + + + + +cubeVoterToWinner = function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) +min3 = minCube(cube3) +max3 = maxCube(cube3) +fnorm3 = doFnorm(max3,min3) +scores3 = doScores(cube3,max3,min3,fnorm3,5,0) + +tally3 = doTally(scores3) +winner3 = findWinner(tally3).slice(0,li); +return winner3 + +} + + + + + +function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) { + if (whichtypetomove == "voter"){ + votergrouptomove = movethisidx + return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + // return superKernelCandidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + } else if (whichtypetomove == "candidate"){ + candidatetomove = movethisidx + return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + // return superKernelVoter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + } +} + +return fastyee +} // end of createKernelYee \ No newline at end of file diff --git a/play/js/Model.js b/play/js/Model.js index 6594318e..4d77eb1e 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -92,6 +92,88 @@ function Model(config){ var density = self.density; WIDTH = ctx.canvas.width; HEIGHT = ctx.canvas.height; + doArrayWay = true + if (doArrayWay) { + // put candidate information into arrays + var canA = [], canAid = [], xc = [], yc = [], fillc = [] , revCan = {} // candidates + var fA = [], fAid = [], xf = [], yf = [], fillf = [] // frontrunners + var movethisidx, whichtypetomove + var i = 0 + for (can in self.candidatesById) { + var c = self.candidatesById[can] + canAid.push(can) + canA.push(c) + revCan[c] = i + xc.push(c.x) + yc.push(c.y) + fillc.push(c.fill) + if (model.frontrunnerSet.has(c.id)) { + fAid.push(can) + fA.push(c) + xf.push(c.x) + yf.push(c.y) + fillf.push(c.fill) // maybe don't need + } + if (self.yeeobject == c){ + movethisidx = i + whichtypetomove = "candidate" + } + i++ + } + // now we have xc,yc,fillc,xf,yf + // maybe we don't need fillf, fA, canA, canAid, fAid, but they might help + + // put voter information into arrays + var av = [], xv = [], yv = [] , vg = [] , xvcenter = [] , yvcenter = []// candidates + var movethisidx, whichtypetomove + var i = 0 + for (vidx in self.voters) { + v = self.voters[vidx] + av.push(v) + xvcenter.push(v.x) + yvcenter.push(v.y) + if (self.yeeobject == v){ + movethisidx = i + whichtypetomove = "voter" + } + for (j in v.points) { + p = v.points[j] + xv.push(p[0] + v.x) + yv.push(p[1] + v.y) + vg.push(i) + } + i++ + } + // now we have xv,yv, + // we might not need av + + // need to compile yee and decide when to recompile + // basically the only reason to recompile is when the number of voters or candidates changes + + lv = xv.length + lc = xc.length + self.fastyeesettings = [lc,lv,WIDTH,HEIGHT,density] + function arraysEqual(arr1, arr2) { + arr1 = arr1 || [0] + arr2 = arr2 || [0] + if(arr1.length !== arr2.length) + return false; + for(var i = arr1.length; i--;) { + if(arr1[i] !== arr2[i]) + return false; + } + + return true; + } + recompileyee = !arraysEqual(self.fastyeesettings,self.oldfastyeesettings) + //(self.fastyeesettings || 0) != (self.oldfastyeesettings || 0)) + self.oldfastyeesettings = self.fastyeesettings + if (recompileyee) { + fastyee = createKernelYee(lc,lv,WIDTH,HEIGHT,density) + } + winners = fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) + + } self.gridx = []; self.gridy = []; self.gridl = []; @@ -102,6 +184,15 @@ function Model(config){ var i=0 for(var x=0.0, cx=0; x<=WIDTH; x+= density, cx++) { for(var y=0.0, cy=0; y<=HEIGHT; y+= density, cy++) { + if (doArrayWay) { + var a = Candidate.graphics[canAid[Math.round(winners[i])]].fill + if (a == "#ccc") {a = "#ddd"} // hack for now, but will deal with ties later + self.gridx.push(x); + self.gridy.push(y); + self.gridl.push(a); + i++; + continue; + } self.yeeobject.x = x * .5; self.yeeobject.y = y * .5; for(var j=0; j {\n ' + kernelRunShortcut.toString() + ';\n const utils = {\n allPropertiesOf: function ' + utils.allPropertiesOf.toString() + ',\n clone: function ' + utils.clone.toString() + ',\n /*splitArray: function ' + utils.splitArray.toString() + ',\n getArgumentType: function ' + utils.getArgumentType.toString() + ',\n getDimensions: function ' + utils.getDimensions.toString() + ',\n dimToTexSize: function ' + utils.dimToTexSize.toString() + ',\n copyFlatten: function ' + utils.copyFlatten.toString() + ',\n flatten: function ' + utils.flatten.toString() + ',\n systemEndianness: \'' + utils.systemEndianness() + '\',\n initWebGl: function ' + utils.initWebGl.toString() + ',\n isArray: function ' + utils.isArray.toString() + '*/\n };\n class ' + (name || 'Kernel') + ' {\n constructor() { \n this.argumentsLength = 0;\n this._canvas = null;\n this._webGl = null;\n this.built = false;\n this.program = null;\n this.paramNames = ' + JSON.stringify(cpuKernel.paramNames) + ';\n this.paramTypes = ' + JSON.stringify(cpuKernel.paramTypes) + ';\n this.texSize = ' + JSON.stringify(cpuKernel.texSize) + ';\n this.dimensions = ' + JSON.stringify(cpuKernel.dimensions) + ';\n this._kernelString = `' + cpuKernel._kernelString + '`;\n\t\t this.run = function() {\n this.run = null;\n this.build();\n return this.run.apply(this, arguments);\n }.bind(this);\n this.thread = {\n x: 0,\n y: 0,\n z: 0\n };\n this.runDimensions = {\n x: null,\n y: null,\n z: null\n };\n }\n setCanvas(canvas) { this._canvas = canvas; return this; }\n setWebGl(webGl) { this._webGl = webGl; return this; }\n ' + cpuKernel.build.toString() + '\n run () { ' + cpuKernel.kernelString + ' }\n getKernelString() { return this._kernelString; }\n };\n return kernelRunShortcut(new Kernel());\n };'; +}; +},{"../../core/utils":24,"../kernel-run-shortcut":9}],4:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var KernelBase = require('../kernel-base'); +var utils = require('../../core/utils'); +var kernelString = require('./kernel-string'); + +module.exports = function (_KernelBase) { + _inherits(CPUKernel, _KernelBase); + + function CPUKernel(fnString, settings) { + _classCallCheck(this, CPUKernel); + + var _this = _possibleConstructorReturn(this, (CPUKernel.__proto__ || Object.getPrototypeOf(CPUKernel)).call(this, fnString, settings)); + + _this._fnBody = utils.getFunctionBodyFromString(fnString); + _this.functionBuilder = settings.functionBuilder; + _this._fn = null; + _this.run = null; + _this._canvasCtx = null; + _this._imageData = null; + _this._colorData = null; + _this._kernelString = null; + _this.thread = { + x: 0, + y: 0, + z: 0 + }; + _this.runDimensions = { + x: null, + y: null, + z: null + }; + + _this.run = function () { + this.run = null; + this.build(); + return this.run.apply(this, arguments); + }.bind(_this); + return _this; + } + + + + _createClass(CPUKernel, [{ + key: 'validateOptions', + value: function validateOptions() { + if (!this.dimensions || this.dimensions.length === 0) { + if (arguments.length !== 1) { + throw 'Auto dimensions only supported for kernels with only one input'; + } + + var argType = utils.getArgumentType(arguments[0]); + if (argType === 'Array') { + this.dimensions = utils.getDimensions(argType); + } else if (argType === 'Texture') { + this.dimensions = arguments[0].dimensions; + } else { + throw 'Auto dimensions not supported for input type: ' + argType; + } + } + } + + + }, { + key: 'build', + value: function build() { + + var kernelArgs = []; + for (var i = 0; i < arguments.length; i++) { + var argType = utils.getArgumentType(arguments[i]); + if (argType === 'Array' || argType === 'Number') { + kernelArgs[i] = arguments[i]; + } else if (argType === 'Texture') { + kernelArgs[i] = arguments[i].toArray(); + } else { + throw 'Input type not supported (CPU): ' + arguments[i]; + } + } + + var threadDim = this.threadDim || (this.threadDim = utils.clone(this.dimensions)); + + while (threadDim.length < 3) { + threadDim.push(1); + } + + if (this.graphical) { + var canvas = this.getCanvas(); + this.runDimensions.x = canvas.width = threadDim[0]; + this.runDimensions.y = canvas.height = threadDim[1]; + this._canvasCtx = canvas.getContext('2d'); + this._imageData = this._canvasCtx.createImageData(threadDim[0], threadDim[1]); + this._colorData = new Uint8ClampedArray(threadDim[0] * threadDim[1] * 4); + } + + var kernelString = this.getKernelString(); + + if (this.debug) { + console.log('Options:'); + console.dir(this); + console.log('Function output:'); + console.log(kernelString); + } + + this.kernelString = kernelString; + this.run = new Function([], kernelString).bind(this)(); + } + }, { + key: 'color', + value: function color(r, g, b, a) { + if (typeof a === 'undefined') { + a = 1; + } + + r = Math.floor(r * 255); + g = Math.floor(g * 255); + b = Math.floor(b * 255); + a = Math.floor(a * 255); + + var width = this.runDimensions.x; + var height = this.runDimensions.y; + + var x = this.thread.x; + var y = height - this.thread.y - 1; + + var index = x + y * width; + + this._colorData[index * 4 + 0] = r; + this._colorData[index * 4 + 1] = g; + this._colorData[index * 4 + 2] = b; + this._colorData[index * 4 + 3] = a; + } + + + }, { + key: 'getKernelString', + value: function getKernelString() { + var _this2 = this; + + if (this._kernelString !== null) return this._kernelString; + + var paramNames = this.paramNames; + var builder = this.functionBuilder; + + var threadDim = this.threadDim || (this.threadDim = utils.clone(this.dimensions)); + while (threadDim.length < 3) { + threadDim.push(1); + } + + if (this.subKernels !== null) { + this.subKernelOutputTextures = []; + this.subKernelOutputVariableNames = []; + for (var i = 0; i < this.subKernels.length; i++) { + var subKernel = this.subKernels[i]; + builder.addSubKernel(subKernel); + this.subKernelOutputVariableNames.push(subKernel.name + 'Result'); + } + } else if (this.subKernelProperties !== null) { + this.subKernelOutputVariableNames = []; + var _i = 0; + for (var p in this.subKernelProperties) { + if (!this.subKernelProperties.hasOwnProperty(p)) continue; + var _subKernel = this.subKernelProperties[p]; + builder.addSubKernel(_subKernel); + this.subKernelOutputVariableNames.push(_subKernel.name + 'Result'); + _i++; + } + } + + return this._kernelString = '\n ' + (this.constants ? Object.keys(this.constants).map(function (key) { + return 'var ' + key + ' = ' + _this2.constants[key]; + }).join(';\n') + ';\n' : '') + '\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' var ' + name + ' = null;\n'; + }).join('')) + '\n ' + builder.getPrototypeString() + '\n var fn = function fn(' + this.paramNames.join(', ') + ') { ' + this._fnBody + ' }.bind(this);\n return function (' + this.paramNames.join(', ') + ') {\n var ret = new Array(' + threadDim[2] + ');\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' ' + name + ' = new Array(' + threadDim[2] + ');\n'; + }).join('')) + '\n for (this.thread.z = 0; this.thread.z < ' + threadDim[2] + '; this.thread.z++) {\n ret[this.thread.z] = new Array(' + threadDim[1] + ');\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' ' + name + '[this.thread.z] = new Array(' + threadDim[1] + ');\n'; + }).join('')) + '\n for (this.thread.y = 0; this.thread.y < ' + threadDim[1] + '; this.thread.y++) {\n ret[this.thread.z][this.thread.y] = new Array(' + threadDim[0] + ');\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' ' + name + '[this.thread.z][this.thread.y] = new Array(' + threadDim[0] + ');\n'; + }).join('')) + '\n for (this.thread.x = 0; this.thread.x < ' + threadDim[0] + '; this.thread.x++) {\n ret[this.thread.z][this.thread.y][this.thread.x] = fn(' + this.paramNames.join(', ') + ');\n }\n }\n }\n \n if (this.graphical) {\n this._imageData.data.set(this._colorData);\n this._canvasCtx.putImageData(this._imageData, 0, 0);\n return;\n }\n \n if (this.dimensions.length === 1) {\n ret = ret[0][0];\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' ' + name + ' = ' + name + '[0][0];\n'; + }).join('')) + '\n \n } else if (this.dimensions.length === 2) {\n ret = ret[0];\n ' + (this.subKernelOutputVariableNames === null ? '' : this.subKernelOutputVariableNames.map(function (name) { + return ' ' + name + ' = ' + name + '[0];\n'; + }).join('')) + '\n }\n \n ' + (this.subKernelOutputVariableNames === null ? 'return ret;\n' : this.subKernels !== null ? 'var result = [\n ' + this.subKernelOutputVariableNames.map(function (name) { + return '' + name; + }).join(',\n') + '\n ];\n result.result = ret;\n return result;\n' : 'return {\n result: ret,\n ' + Object.keys(this.subKernelProperties).map(function (name, i) { + return name + ': ' + _this2.subKernelOutputVariableNames[i]; + }).join(',\n') + '\n };') + '\n }.bind(this);'; + } + + + }, { + key: 'toString', + value: function toString() { + return kernelString(this); + } + + + }, { + key: 'precompileKernelObj', + value: function precompileKernelObj(argTypes) { + + var threadDim = this.threadDim || (this.threadDim = utils.clone(this.dimensions)); + + return { + threadDim: threadDim + }; + } + + + }], [{ + key: 'compileKernel', + value: function compileKernel(precompileObj) { + + var threadDim = precompileObj.threadDim; + + while (threadDim.length < 3) { + threadDim.push(1); + } + } + }]); + + return CPUKernel; +}(KernelBase); +},{"../../core/utils":24,"../kernel-base":8,"./kernel-string":3}],5:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var utils = require('../../core/utils'); +var RunnerBase = require('../runner-base'); +var CPUKernel = require('./kernel'); +var CPUFunctionBuilder = require('./function-builder'); + +module.exports = function (_RunnerBase) { + _inherits(CPURunner, _RunnerBase); + + + function CPURunner(settings) { + _classCallCheck(this, CPURunner); + + var _this = _possibleConstructorReturn(this, (CPURunner.__proto__ || Object.getPrototypeOf(CPURunner)).call(this, new CPUFunctionBuilder(), settings)); + + _this.Kernel = CPUKernel; + _this.kernel = null; + return _this; + } + + + + _createClass(CPURunner, [{ + key: 'getMode', + value: function getMode() { + return 'cpu'; + } + }]); + + return CPURunner; +}(RunnerBase); +},{"../../core/utils":24,"../runner-base":10,"./function-builder":1,"./kernel":4}],6:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +module.exports = function () { + + function FunctionBuilderBase(gpu) { + _classCallCheck(this, FunctionBuilderBase); + + this.nodeMap = {}; + this.gpu = gpu; + this.rootKernel = null; + } + + + + _createClass(FunctionBuilderBase, [{ + key: 'addFunction', + value: function addFunction(functionName, jsFunction, paramTypes, returnType) { + throw new Error('addFunction not supported on base'); + } + + + }, { + key: 'addFunctionNode', + value: function addFunctionNode(inNode) { + this.nodeMap[inNode.functionName] = inNode; + if (inNode.isRootKernel) { + this.rootKernel = inNode; + } + } + + + }, { + key: 'traceFunctionCalls', + value: function traceFunctionCalls(functionName, retList, parent) { + functionName = functionName || 'kernel'; + retList = retList || []; + + var fNode = this.nodeMap[functionName]; + if (fNode) { + if (retList.indexOf(functionName) >= 0) { + } else { + retList.push(functionName); + if (parent) { + fNode.parent = parent; + fNode.constants = parent.constants; + } + fNode.getFunctionString(); + for (var i = 0; i < fNode.calledFunctions.length; ++i) { + this.traceFunctionCalls(fNode.calledFunctions[i], retList, fNode); + } + } + } + + return retList; + } + + + + }, { + key: 'polyfillStandardFunctions', + + + value: function polyfillStandardFunctions() { + this.addFunction('round', _round); + } + }], [{ + key: 'round', + value: function round(a) { + return _round(a); + } + }]); + + return FunctionBuilderBase; +}(); + +function _round(a) { + return Math.floor(a + 0.5); +} +},{}],7:[function(require,module,exports){ +'use strict'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var utils = require('../core/utils'); +var acorn = require('acorn'); + +module.exports = function () { + + function BaseFunctionNode(functionName, jsFunction, options, paramTypes, returnType) { + _classCallCheck(this, BaseFunctionNode); + + this.calledFunctions = []; + this.calledFunctionsArguments = {}; + this.initVariables = []; + this.readVariables = []; + this.writeVariables = []; + this.addFunction = null; + this.isRootKernel = false; + this.isSubKernel = false; + this.parent = null; + this.debug = null; + this.prototypeOnly = null; + this.constants = null; + + if (options) { + if (options.hasOwnProperty('debug')) { + this.debug = options.debug; + } + if (options.hasOwnProperty('prototypeOnly')) { + this.prototypeOnly = options.prototypeOnly; + } + if (options.hasOwnProperty('constants')) { + this.constants = options.constants; + } + if (options.hasOwnProperty('loopMaxIterations')) { + this.loopMaxIterations = options.loopMaxIterations; + } + } + + if (!jsFunction) { + throw 'jsFunction, parameter is missing'; + } + + this.jsFunctionString = jsFunction.toString(); + if (!utils.isFunctionString(this.jsFunctionString)) { + console.error('jsFunction, to string conversion check failed: not a function?', this.jsFunctionString); + throw 'jsFunction, to string conversion check failed: not a function?'; + } + + if (!utils.isFunction(jsFunction)) { + this.jsFunction = null; + } else { + this.jsFunction = jsFunction; + } + + this.functionName = functionName || jsFunction && jsFunction.name || utils.getFunctionNameFromString(this.jsFunctionString); + + if (!this.functionName) { + throw 'jsFunction, missing name argument or value'; + } + + this.paramNames = utils.getParamNamesFromString(this.jsFunctionString); + if (paramTypes) { + if (Array.isArray(paramTypes)) { + if (paramTypes.length !== this.paramNames.length) { + throw 'Invalid argument type array length, against function length -> (' + paramTypes.length + ',' + this.paramNames.length + ')'; + } + this.paramTypes = paramTypes; + } else if ((typeof paramTypes === 'undefined' ? 'undefined' : _typeof(paramTypes)) === 'object') { + var paramVariableNames = Object.keys(paramTypes); + if (paramTypes.hasOwnProperty('returns')) { + this.returnType = paramTypes.returns; + paramVariableNames.splice(paramVariableNames.indexOf('returns'), 1); + } + if (paramVariableNames.length > 0 && paramVariableNames.length !== this.paramNames.length) { + throw 'Invalid argument type array length, against function length -> (' + paramVariableNames.length + ',' + this.paramNames.length + ')'; + } else { + this.paramTypes = this.paramNames.map(function (key) { + if (paramTypes.hasOwnProperty(key)) { + return paramTypes[key]; + } else { + return 'float'; + } + }); + } + } + } else { + this.paramTypes = []; + } + + if (!this.returnType) { + this.returnType = returnType || 'float'; + } + } + + _createClass(BaseFunctionNode, [{ + key: 'setAddFunction', + value: function setAddFunction(fn) { + this.addFunction = fn; + return this; + } + + + }, { + key: 'getJsFunction', + value: function getJsFunction() { + if (this.jsFunction) { + return this.jsFunction; + } + + if (this.jsFunctionString) { + this.jsFunction = eval(this.jsFunctionString); + return this.jsFunction; + } + + throw 'Missing jsFunction, and jsFunctionString parameter'; + } + + + + + }, { + key: 'getJsAST', + value: function getJsAST(inParser) { + if (this.jsFunctionAST) { + return this.jsFunctionAST; + } + + inParser = inParser || acorn; + if (inParser === null) { + throw 'Missing JS to AST parser'; + } + + var ast = inParser.parse('var ' + this.functionName + ' = ' + this.jsFunctionString + ';'); + if (ast === null) { + throw 'Failed to parse JS code'; + } + + var funcAST = ast.body[0].declarations[0].init; + this.jsFunctionAST = funcAST; + + return funcAST; + } + + + }, { + key: 'getFunctionString', + value: function getFunctionString() { + this.generate(); + return this.functionString; + } + + + }, { + key: 'setFunctionString', + value: function setFunctionString(functionString) { + this.functionString = functionString; + } + + + }, { + key: 'getParamType', + value: function getParamType(paramName) { + var paramIndex = this.paramNames.indexOf(paramName); + if (paramIndex === -1) return null; + if (!this.parent) return null; + if (this.paramTypes[paramIndex]) return this.paramTypes[paramIndex]; + var calledFunctionArguments = this.parent.calledFunctionsArguments[this.functionName]; + for (var i = 0; i < calledFunctionArguments.length; i++) { + var calledFunctionArgument = calledFunctionArguments[i]; + if (calledFunctionArgument[paramIndex] !== null) { + return this.paramTypes[paramIndex] = calledFunctionArgument[paramIndex].type; + } + } + return null; + } + + + }, { + key: 'getUserParamName', + value: function getUserParamName(paramName) { + var paramIndex = this.paramNames.indexOf(paramName); + if (paramIndex === -1) return null; + if (!this.parent) return null; + var calledFunctionArguments = this.parent.calledFunctionsArguments[this.functionName]; + for (var i = 0; i < calledFunctionArguments.length; i++) { + var calledFunctionArgument = calledFunctionArguments[i]; + if (calledFunctionArgument[paramIndex] !== null) { + return calledFunctionArgument[paramIndex].name; + } + } + return null; + } + }, { + key: 'generate', + value: function generate(options) { + throw new Error('generate not defined on BaseFunctionNode'); + } + }]); + + return BaseFunctionNode; +}(); +},{"../core/utils":24,"acorn":26}],8:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var utils = require('../core/utils'); + +module.exports = function () { + + function BaseKernel(fnString, settings) { + _classCallCheck(this, BaseKernel); + + this.paramNames = utils.getParamNamesFromString(fnString); + this.fnString = fnString; + this.dimensions = []; + this.debug = false; + this.graphical = false; + this.loopMaxIterations = 0; + this.constants = null; + this.wraparound = null; + this.hardcodeConstants = null; + this.outputToTexture = null; + this.texSize = null; + this._canvas = null; + this._webGl = null; + this.threadDim = null; + this.floatTextures = null; + this.floatOutput = null; + this.floatOutputForce = null; + this.addFunction = null; + this.copyData = true; + this.subKernels = null; + this.subKernelProperties = null; + this.subKernelNames = null; + this.subKernelOutputVariableNames = null; + + for (var p in settings) { + if (!settings.hasOwnProperty(p) || !this.hasOwnProperty(p)) continue; + this[p] = settings[p]; + } + if (settings.hasOwnProperty('canvas')) { + this._canvas = settings.canvas; + } + + if (!this._canvas) this._canvas = utils.initCanvas(); + } + + _createClass(BaseKernel, [{ + key: 'build', + value: function build() { + throw new Error('"build" not defined on Base'); + } + }, { + key: 'setAddFunction', + value: function setAddFunction(cb) { + this.addFunction = cb; + return this; + } + + + }, { + key: 'setDimensions', + value: function setDimensions(dimensions) { + this.dimensions = dimensions; + return this; + } + + + }, { + key: 'setDebug', + value: function setDebug(flag) { + this.debug = flag; + return this; + } + + + }, { + key: 'setGraphical', + value: function setGraphical(flag) { + this.graphical = flag; + return this; + } + + + }, { + key: 'setLoopMaxIterations', + value: function setLoopMaxIterations(max) { + this.loopMaxIterations = max; + return this; + } + + + }, { + key: 'setConstants', + value: function setConstants(constants) { + this.constants = constants; + return this; + } + }, { + key: 'setWraparound', + value: function setWraparound(flag) { + console.warn('Wraparound mode is not supported and undocumented.'); + this.wraparound = flag; + return this; + } + }, { + key: 'setHardcodeConstants', + value: function setHardcodeConstants(flag) { + this.hardcodeConstants = flag; + return this; + } + }, { + key: 'setOutputToTexture', + value: function setOutputToTexture(flag) { + this.outputToTexture = flag; + return this; + } + + + }, { + key: 'setFloatTextures', + value: function setFloatTextures(flag) { + this.floatTextures = flag; + return this; + } + + + }, { + key: 'setFloatOutput', + value: function setFloatOutput(flag) { + this.floatOutput = flag; + return this; + } + }, { + key: 'setFloatOutputForce', + value: function setFloatOutputForce(flag) { + this.floatOutputForce = flag; + return this; + } + + + }, { + key: 'setCanvas', + value: function setCanvas(canvas) { + this._canvas = canvas; + return this; + } + + + }, { + key: 'setWebGl', + value: function setWebGl(webGl) { + this._webGl = webGl; + return this; + } + }, { + key: 'setCopyData', + value: function setCopyData(copyData) { + this.copyData = copyData; + return this; + } + + + }, { + key: 'getCanvas', + value: function getCanvas() { + return this._canvas; + } + + + }, { + key: 'getWebGl', + value: function getWebGl() { + return this._webGl; + } + }, { + key: 'validateOptions', + value: function validateOptions() { + throw new Error('validateOptions not defined'); + } + }, { + key: 'exec', + value: function exec() { + return this.execute.apply(this, arguments); + } + }, { + key: 'execute', + value: function execute() { + var _this = this; + + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments); + + return utils.newPromise(function (accept, reject) { + try { + accept(_this.run.apply(_this, args)); + } catch (e) { + reject(e); + } + }); + } + + + }, { + key: 'addSubKernel', + value: function addSubKernel(fnString) { + if (this.subKernels === null) { + this.subKernels = []; + this.subKernelNames = []; + } + this.subKernels.push(fnString); + this.subKernelNames.push(utils.getFunctionNameFromString(fnString)); + return this; + } + + + }, { + key: 'addSubKernelProperty', + value: function addSubKernelProperty(property, fnString) { + if (this.subKernelProperties === null) { + this.subKernelProperties = {}; + this.subKernelNames = []; + } + if (this.subKernelProperties.hasOwnProperty(property)) { + throw new Error('cannot add sub kernel ' + property + ', already defined'); + } + this.subKernelProperties[property] = fnString; + this.subKernelNames.push(utils.getFunctionNameFromString(fnString)); + return this; + } + }]); + + return BaseKernel; +}(); +},{"../core/utils":24}],9:[function(require,module,exports){ +'use strict'; + +var utils = require('../core/utils'); + +module.exports = function kernelRunShortcut(kernel) { + var shortcut = function shortcut() { + return kernel.run.apply(kernel, arguments); + }; + + utils.allPropertiesOf(kernel).forEach(function (key) { + if (key[0] === '_' && key[1] === '_') return; + if (typeof kernel[key] === 'function') { + if (key.substring(0, 3) === 'set') { + shortcut[key] = function () { + kernel[key].apply(kernel, arguments); + return shortcut; + }; + } else { + shortcut[key] = kernel[key].bind(kernel); + } + } else { + shortcut.__defineGetter__(key, function () { + return kernel[key]; + }); + shortcut.__defineSetter__(key, function (value) { + kernel[key] = value; + }); + } + }); + + shortcut.kernel = kernel; + + return shortcut; +}; +},{"../core/utils":24}],10:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var utils = require('../core/utils'); +var kernelRunShortcut = require('./kernel-run-shortcut'); + +module.exports = function () { + + + function BaseRunner(functionBuilder, settings) { + _classCallCheck(this, BaseRunner); + + settings = settings || {}; + this.kernel = settings.kernel; + this.canvas = settings.canvas; + this.webGl = settings.webGl; + this.fn = null; + this.functionBuilder = functionBuilder; + this.fnString = null; + this.endianness = utils.systemEndianness(); + this.functionBuilder.polyfillStandardFunctions(); + } + + + + _createClass(BaseRunner, [{ + key: 'textureToArray', + value: function textureToArray(texture) { + var copy = this.createKernel(function (x) { + return x[this.thread.z][this.thread.y][this.thread.x]; + }); + + return copy(texture); + } + + + }, { + key: 'deleteTexture', + value: function deleteTexture(texture) { + this.webGl.deleteTexture(texture.texture); + } + + + }, { + key: 'buildPromiseKernel', + value: function buildPromiseKernel() { + throw new Error('not yet implemented'); + } + }, { + key: 'getMode', + value: function getMode() { + throw new Error('"mode" not implemented on BaseRunner'); + } + + + }, { + key: 'buildKernel', + value: function buildKernel(fn, settings) { + settings = Object.assign({}, settings || {}); + var fnString = fn.toString(); + if (!settings.functionBuilder) { + settings.functionBuilder = this.functionBuilder; + } + + if (!settings.canvas) { + settings.canvas = this.canvas; + } + + if (!settings.webGl) { + settings.webGl = this.webgl; + } + + return kernelRunShortcut(new this.Kernel(fnString, settings)); + } + }]); + + return BaseRunner; +}(); +},{"../core/utils":24,"./kernel-run-shortcut":9}],11:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var FunctionBuilderBase = require('../function-builder-base'); +var WebGLFunctionNode = require('./function-node'); +var utils = require('../../core/utils'); + +module.exports = function (_FunctionBuilderBase) { + _inherits(WebGLFunctionBuilder, _FunctionBuilderBase); + + function WebGLFunctionBuilder() { + _classCallCheck(this, WebGLFunctionBuilder); + + return _possibleConstructorReturn(this, (WebGLFunctionBuilder.__proto__ || Object.getPrototypeOf(WebGLFunctionBuilder)).apply(this, arguments)); + } + + _createClass(WebGLFunctionBuilder, [{ + key: 'addFunction', + value: function addFunction(functionName, jsFunction, paramTypes, returnType) { + this.addFunctionNode(new WebGLFunctionNode(functionName, jsFunction, paramTypes, returnType).setAddFunction(this.addFunction.bind(this))); + } + + + }, { + key: 'getStringFromFunctionNames', + value: function getStringFromFunctionNames(functionList) { + var ret = []; + for (var i = 0; i < functionList.length; ++i) { + var node = this.nodeMap[functionList[i]]; + if (node) { + ret.push(this.nodeMap[functionList[i]].getFunctionString()); + } + } + return ret.join('\n'); + } + + + }, { + key: 'getPrototypeStringFromFunctionNames', + value: function getPrototypeStringFromFunctionNames(functionList, opt) { + var ret = []; + for (var i = 0; i < functionList.length; ++i) { + var node = this.nodeMap[functionList[i]]; + if (node) { + ret.push(node.getFunctionPrototypeString(opt)); + } + } + return ret.join('\n'); + } + + + }, { + key: 'getString', + value: function getString(functionName, opt) { + if (opt === undefined) { + opt = {}; + } + + if (functionName) { + return this.getStringFromFunctionNames(this.traceFunctionCalls(functionName, [], opt).reverse(), opt); + } + return this.getStringFromFunctionNames(Object.keys(this.nodeMap), opt); + } + + + }, { + key: 'getPrototypeString', + value: function getPrototypeString(functionName) { + this.rootKernel.generate(); + if (functionName) { + return this.getPrototypeStringFromFunctionNames(this.traceFunctionCalls(functionName, []).reverse()); + } + return this.getPrototypeStringFromFunctionNames(Object.keys(this.nodeMap)); + } + + + }, { + key: 'addKernel', + value: function addKernel(fnString, options, paramNames, paramTypes) { + var kernelNode = new WebGLFunctionNode('kernel', fnString, options, paramTypes); + kernelNode.setAddFunction(this.addFunction.bind(this)); + kernelNode.paramNames = paramNames; + kernelNode.paramTypes = paramTypes; + kernelNode.isRootKernel = true; + this.addFunctionNode(kernelNode); + return kernelNode; + } + + + }, { + key: 'addSubKernel', + value: function addSubKernel(jsFunction, options, paramTypes, returnType) { + var kernelNode = new WebGLFunctionNode(null, jsFunction, options, paramTypes, returnType); + kernelNode.setAddFunction(this.addFunction.bind(this)); + kernelNode.isSubKernel = true; + this.addFunctionNode(kernelNode); + return kernelNode; + } + }]); + + return WebGLFunctionBuilder; +}(FunctionBuilderBase); +},{"../../core/utils":24,"../function-builder-base":6,"./function-node":12}],12:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var FunctionNodeBase = require('../function-node-base'); +var utils = require('../../core/utils'); +var jsMathPrefix = 'Math.'; +var localPrefix = 'this.'; +var constantsPrefix = 'this.constants.'; + +var DECODE32_ENCODE32 = /decode32\(\s+encode32\(/g; +var ENCODE32_DECODE32 = /encode32\(\s+decode32\(/g; + +module.exports = function (_FunctionNodeBase) { + _inherits(WebGLFunctionNode, _FunctionNodeBase); + + function WebGLFunctionNode() { + _classCallCheck(this, WebGLFunctionNode); + + return _possibleConstructorReturn(this, (WebGLFunctionNode.__proto__ || Object.getPrototypeOf(WebGLFunctionNode)).apply(this, arguments)); + } + + _createClass(WebGLFunctionNode, [{ + key: 'generate', + value: function generate() { + if (this.debug) { + console.log(this); + } + if (this.prototypeOnly) { + return WebGLFunctionNode.astFunctionPrototype(this.getJsAST(), [], this).join('').trim(); + } else { + this.functionStringArray = this.astGeneric(this.getJsAST(), [], this); + } + this.functionString = webGlRegexOptimize(this.functionStringArray.join('').trim()); + return this.functionString; + } + }, { + key: 'isIdentifierConstant', + value: function isIdentifierConstant(paramName) { + if (!this.constants) return false; + return this.constants.hasOwnProperty(paramName); + } + + + }, { + key: 'astGeneric', + value: function astGeneric(ast, retArr, funcParam) { + if (ast === null) { + throw astErrorOutput('NULL ast', ast, funcParam); + } else { + if (Array.isArray(ast)) { + for (var i = 0; i < ast.length; i++) { + this.astGeneric(ast[i], retArr, funcParam); + } + return retArr; + } + + switch (ast.type) { + case 'FunctionDeclaration': + return this.astFunctionDeclaration(ast, retArr, funcParam); + case 'FunctionExpression': + return this.astFunctionExpression(ast, retArr, funcParam); + case 'ReturnStatement': + return this.astReturnStatement(ast, retArr, funcParam); + case 'Literal': + return this.astLiteral(ast, retArr, funcParam); + case 'BinaryExpression': + return this.astBinaryExpression(ast, retArr, funcParam); + case 'Identifier': + return this.astIdentifierExpression(ast, retArr, funcParam); + case 'AssignmentExpression': + return this.astAssignmentExpression(ast, retArr, funcParam); + case 'ExpressionStatement': + return this.astExpressionStatement(ast, retArr, funcParam); + case 'EmptyStatement': + return this.astEmptyStatement(ast, retArr, funcParam); + case 'BlockStatement': + return this.astBlockStatement(ast, retArr, funcParam); + case 'IfStatement': + return this.astIfStatement(ast, retArr, funcParam); + case 'BreakStatement': + return this.astBreakStatement(ast, retArr, funcParam); + case 'ContinueStatement': + return this.astContinueStatement(ast, retArr, funcParam); + case 'ForStatement': + return this.astForStatement(ast, retArr, funcParam); + case 'WhileStatement': + return this.astWhileStatement(ast, retArr, funcParam); + case 'VariableDeclaration': + return this.astVariableDeclaration(ast, retArr, funcParam); + case 'VariableDeclarator': + return this.astVariableDeclarator(ast, retArr, funcParam); + case 'ThisExpression': + return this.astThisExpression(ast, retArr, funcParam); + case 'SequenceExpression': + return this.astSequenceExpression(ast, retArr, funcParam); + case 'UnaryExpression': + return this.astUnaryExpression(ast, retArr, funcParam); + case 'UpdateExpression': + return this.astUpdateExpression(ast, retArr, funcParam); + case 'LogicalExpression': + return this.astLogicalExpression(ast, retArr, funcParam); + case 'MemberExpression': + return this.astMemberExpression(ast, retArr, funcParam); + case 'CallExpression': + return this.astCallExpression(ast, retArr, funcParam); + case 'ArrayExpression': + return this.astArrayExpression(ast, retArr, funcParam); + } + + throw astErrorOutput('Unknown ast type : ' + ast.type, ast, funcParam); + } + } + + + }, { + key: 'astFunctionDeclaration', + value: function astFunctionDeclaration(ast, retArr, funcParam) { + if (this.addFunction) { + this.addFunction(null, utils.getAstString(this.jsFunctionString, ast)); + } + return retArr; + } + + + }, { + key: 'astFunctionExpression', + + + value: function astFunctionExpression(ast, retArr, funcParam) { + + if (funcParam.isRootKernel) { + retArr.push('void'); + funcParam.kernalAst = ast; + } else { + retArr.push(funcParam.returnType); + } + retArr.push(' '); + retArr.push(funcParam.functionName); + retArr.push('('); + + if (!funcParam.isRootKernel) { + for (var i = 0; i < funcParam.paramNames.length; ++i) { + var paramName = funcParam.paramNames[i]; + + if (i > 0) { + retArr.push(', '); + } + var type = funcParam.getParamType(paramName); + switch (type) { + case 'Texture': + case 'Array': + retArr.push('sampler2D'); + break; + default: + retArr.push('float'); + } + + retArr.push(' '); + retArr.push('user_'); + retArr.push(paramName); + } + } + + retArr.push(') {\n'); + + for (var _i = 0; _i < ast.body.body.length; ++_i) { + this.astGeneric(ast.body.body[_i], retArr, funcParam); + retArr.push('\n'); + } + + retArr.push('}\n'); + return retArr; + } + + + }, { + key: 'astReturnStatement', + value: function astReturnStatement(ast, retArr, funcParam) { + if (funcParam.isRootKernel) { + retArr.push('kernelResult = '); + this.astGeneric(ast.argument, retArr, funcParam); + retArr.push(';'); + retArr.push('return;'); + } else if (funcParam.isSubKernel) { + retArr.push(funcParam.functionName + 'Result = '); + this.astGeneric(ast.argument, retArr, funcParam); + retArr.push(';'); + retArr.push('return ' + funcParam.functionName + 'Result;'); + } else { + retArr.push('return '); + this.astGeneric(ast.argument, retArr, funcParam); + retArr.push(';'); + } + + + return retArr; + } + + + }, { + key: 'astLiteral', + value: function astLiteral(ast, retArr, funcParam) { + + if (isNaN(ast.value)) { + throw astErrorOutput('Non-numeric literal not supported : ' + ast.value, ast, funcParam); + } + + retArr.push(ast.value); + + if (Number.isInteger(ast.value)) { + retArr.push('.0'); + } + + return retArr; + } + + + }, { + key: 'astBinaryExpression', + value: function astBinaryExpression(ast, retArr, funcParam) { + retArr.push('('); + + if (ast.operator === '%') { + retArr.push('mod('); + this.astGeneric(ast.left, retArr, funcParam); + retArr.push(','); + this.astGeneric(ast.right, retArr, funcParam); + retArr.push(')'); + } else if (ast.operator === '===') { + this.astGeneric(ast.left, retArr, funcParam); + retArr.push('=='); + this.astGeneric(ast.right, retArr, funcParam); + } else if (ast.operator === '!==') { + this.astGeneric(ast.left, retArr, funcParam); + retArr.push('!='); + this.astGeneric(ast.right, retArr, funcParam); + } else { + this.astGeneric(ast.left, retArr, funcParam); + retArr.push(ast.operator); + this.astGeneric(ast.right, retArr, funcParam); + } + + retArr.push(')'); + + return retArr; + } + + + }, { + key: 'astIdentifierExpression', + value: function astIdentifierExpression(idtNode, retArr, funcParam) { + if (idtNode.type !== 'Identifier') { + throw astErrorOutput('IdentifierExpression - not an Identifier', ast, funcParam); + } + + switch (idtNode.name) { + case 'gpu_threadX': + retArr.push('threadId.x'); + break; + case 'gpu_threadY': + retArr.push('threadId.y'); + break; + case 'gpu_threadZ': + retArr.push('threadId.z'); + break; + case 'gpu_dimensionsX': + retArr.push('uOutputDim.x'); + break; + case 'gpu_dimensionsY': + retArr.push('uOutputDim.y'); + break; + case 'gpu_dimensionsZ': + retArr.push('uOutputDim.z'); + break; + default: + if (this.constants && this.constants.hasOwnProperty(idtNode.name)) { + retArr.push('constants_' + idtNode.name); + } else { + var userParamName = funcParam.getUserParamName(idtNode.name); + if (userParamName !== null) { + retArr.push('user_' + userParamName); + } else { + retArr.push('user_' + idtNode.name); + } + } + } + + return retArr; + } + + + }, { + key: 'astForStatement', + value: function astForStatement(forNode, retArr, funcParam) { + if (forNode.type !== 'ForStatement') { + throw astErrorOutput('Invalid for statment', ast, funcParam); + } + + if (forNode.test && forNode.test.type === 'BinaryExpression') { + if (forNode.test.right.type === 'Identifier' && forNode.test.operator === '<' && this.isIdentifierConstant(forNode.test.right.name) === false) { + + if (this.opt.loopMaxIterations === undefined) { + console.warn('Warning: loopMaxIterations is not set! Using default of 100 which may result in unintended behavior.'); + console.warn('Set loopMaxIterations or use a for loop of fixed length to silence this message.'); + } + + retArr.push('for (float '); + this.astGeneric(forNode.init, retArr, funcParam); + retArr.push(';'); + this.astGeneric(forNode.test.left, retArr, funcParam); + retArr.push(forNode.test.operator); + retArr.push('LOOP_MAX'); + retArr.push(';'); + this.astGeneric(forNode.update, retArr, funcParam); + retArr.push(')'); + + retArr.push('{\n'); + retArr.push('if ('); + this.astGeneric(forNode.test.left, retArr, funcParam); + retArr.push(forNode.test.operator); + this.astGeneric(forNode.test.right, retArr, funcParam); + retArr.push(') {\n'); + if (forNode.body.type === 'BlockStatement') { + for (var i = 0; i < forNode.body.body.length; i++) { + this.astGeneric(forNode.body.body[i], retArr, funcParam); + } + } else { + this.astGeneric(forNode.body, retArr, funcParam); + } + retArr.push('} else {\n'); + retArr.push('break;\n'); + retArr.push('}\n'); + retArr.push('}\n'); + + return retArr; + } else { + var declarations = JSON.parse(JSON.stringify(forNode.init.declarations)); + var updateArgument = forNode.update.argument; + if (!Array.isArray(declarations) || declarations.length < 1) { + console.log(this.jsFunctionString); + throw new Error('Error: Incompatible for loop declaration'); + } + + if (declarations.length > 1) { + var initArgument = null; + for (var _i2 = 0; _i2 < declarations.length; _i2++) { + var declaration = declarations[_i2]; + if (declaration.id.name === updateArgument.name) { + initArgument = declaration; + declarations.splice(_i2, 1); + } else { + retArr.push('float '); + this.astGeneric(declaration, retArr, funcParam); + retArr.push(';'); + } + } + + retArr.push('for (float '); + this.astGeneric(initArgument, retArr, funcParam); + retArr.push(';'); + } else { + retArr.push('for ('); + this.astGeneric(forNode.init, retArr, funcParam); + } + + this.astGeneric(forNode.test, retArr, funcParam); + retArr.push(';'); + this.astGeneric(forNode.update, retArr, funcParam); + retArr.push(')'); + this.astGeneric(forNode.body, retArr, funcParam); + return retArr; + } + } + + throw astErrorOutput('Invalid for statement', ast, funcParam); + } + + + }, { + key: 'astWhileStatement', + value: function astWhileStatement(whileNode, retArr, funcParam) { + if (whileNode.type !== 'WhileStatement') { + throw astErrorOutput('Invalid while statment', ast, funcParam); + } + + retArr.push('for (float i = 0.0; i < LOOP_MAX; i++) {'); + retArr.push('if ('); + this.astGeneric(whileNode.test, retArr, funcParam); + retArr.push(') {\n'); + this.astGeneric(whileNode.body, retArr, funcParam); + retArr.push('} else {\n'); + retArr.push('break;\n'); + retArr.push('}\n'); + retArr.push('}\n'); + + return retArr; + } + + + }, { + key: 'astAssignmentExpression', + value: function astAssignmentExpression(assNode, retArr, funcParam) { + if (assNode.operator === '%=') { + this.astGeneric(assNode.left, retArr, funcParam); + retArr.push('='); + retArr.push('mod('); + this.astGeneric(assNode.left, retArr, funcParam); + retArr.push(','); + this.astGeneric(assNode.right, retArr, funcParam); + retArr.push(')'); + } else { + this.astGeneric(assNode.left, retArr, funcParam); + retArr.push(assNode.operator); + this.astGeneric(assNode.right, retArr, funcParam); + return retArr; + } + } + + + }, { + key: 'astEmptyStatement', + value: function astEmptyStatement(eNode, retArr, funcParam) { + return retArr; + } + + + }, { + key: 'astBlockStatement', + value: function astBlockStatement(bNode, retArr, funcParam) { + retArr.push('{\n'); + for (var i = 0; i < bNode.body.length; i++) { + this.astGeneric(bNode.body[i], retArr, funcParam); + } + retArr.push('}\n'); + return retArr; + } + + + }, { + key: 'astExpressionStatement', + value: function astExpressionStatement(esNode, retArr, funcParam) { + this.astGeneric(esNode.expression, retArr, funcParam); + retArr.push(';\n'); + return retArr; + } + + + }, { + key: 'astVariableDeclaration', + value: function astVariableDeclaration(vardecNode, retArr, funcParam) { + retArr.push('float '); + for (var i = 0; i < vardecNode.declarations.length; i++) { + if (i > 0) { + retArr.push(','); + } + this.astGeneric(vardecNode.declarations[i], retArr, funcParam); + } + retArr.push(';'); + return retArr; + } + + + }, { + key: 'astVariableDeclarator', + value: function astVariableDeclarator(ivardecNode, retArr, funcParam) { + this.astGeneric(ivardecNode.id, retArr, funcParam); + if (ivardecNode.init !== null) { + retArr.push('='); + this.astGeneric(ivardecNode.init, retArr, funcParam); + } + return retArr; + } + + + }, { + key: 'astIfStatement', + value: function astIfStatement(ifNode, retArr, funcParam) { + retArr.push('if ('); + this.astGeneric(ifNode.test, retArr, funcParam); + retArr.push(')'); + if (ifNode.consequent.type === 'BlockStatement') { + this.astGeneric(ifNode.consequent, retArr, funcParam); + } else { + retArr.push(' {\n'); + this.astGeneric(ifNode.consequent, retArr, funcParam); + retArr.push('\n}\n'); + } + + if (ifNode.alternate) { + retArr.push('else '); + if (ifNode.alternate.type === 'BlockStatement') { + this.astGeneric(ifNode.alternate, retArr, funcParam); + } else { + retArr.push(' {\n'); + this.astGeneric(ifNode.alternate, retArr, funcParam); + retArr.push('\n}\n'); + } + } + return retArr; + } + + + }, { + key: 'astBreakStatement', + value: function astBreakStatement(brNode, retArr, funcParam) { + retArr.push('break;\n'); + return retArr; + } + + + }, { + key: 'astContinueStatement', + value: function astContinueStatement(crNode, retArr, funcParam) { + retArr.push('continue;\n'); + return retArr; + } + + + }, { + key: 'astLogicalExpression', + value: function astLogicalExpression(logNode, retArr, funcParam) { + retArr.push('('); + this.astGeneric(logNode.left, retArr, funcParam); + retArr.push(logNode.operator); + this.astGeneric(logNode.right, retArr, funcParam); + retArr.push(')'); + return retArr; + } + + + }, { + key: 'astUpdateExpression', + value: function astUpdateExpression(uNode, retArr, funcParam) { + if (uNode.prefix) { + retArr.push(uNode.operator); + this.astGeneric(uNode.argument, retArr, funcParam); + } else { + this.astGeneric(uNode.argument, retArr, funcParam); + retArr.push(uNode.operator); + } + + return retArr; + } + + + }, { + key: 'astUnaryExpression', + value: function astUnaryExpression(uNode, retArr, funcParam) { + if (uNode.prefix) { + retArr.push(uNode.operator); + this.astGeneric(uNode.argument, retArr, funcParam); + } else { + this.astGeneric(uNode.argument, retArr, funcParam); + retArr.push(uNode.operator); + } + + return retArr; + } + + + }, { + key: 'astThisExpression', + value: function astThisExpression(tNode, retArr, funcParam) { + retArr.push('this'); + return retArr; + } + + + }, { + key: 'astMemberExpression', + value: function astMemberExpression(mNode, retArr, funcParam) { + if (mNode.computed) { + if (mNode.object.type === 'Identifier') { + var reqName = mNode.object.name; + var funcName = funcParam.functionName || 'kernel'; + var assumeNotTexture = false; + + if (funcParam.paramNames) { + var idx = funcParam.paramNames.indexOf(reqName); + if (idx >= 0 && funcParam.paramTypes[idx] === 'float') { + assumeNotTexture = true; + } + } + + if (assumeNotTexture) { + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('[int('); + this.astGeneric(mNode.property, retArr, funcParam); + retArr.push(')]'); + } else { + retArr.push('get('); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push(', vec2('); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('Size[0],'); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('Size[1]), vec3('); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('Dim[0],'); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('Dim[1],'); + this.astGeneric(mNode.object, retArr, funcParam); + retArr.push('Dim[2]'); + retArr.push('), '); + this.astGeneric(mNode.property, retArr, funcParam); + retArr.push(')'); + } + } else { + this.astGeneric(mNode.object, retArr, funcParam); + var last = retArr.pop(); + retArr.push(','); + this.astGeneric(mNode.property, retArr, funcParam); + retArr.push(last); + } + } else { + + var unrolled = this.astMemberExpressionUnroll(mNode); + var unrolled_lc = unrolled.toLowerCase(); + + if (unrolled.indexOf(constantsPrefix) === 0) { + unrolled = 'constants_' + unrolled.slice(constantsPrefix.length); + } + + if (unrolled_lc === 'this.thread.x') { + retArr.push('threadId.x'); + } else if (unrolled_lc === 'this.thread.y') { + retArr.push('threadId.y'); + } else if (unrolled_lc === 'this.thread.z') { + retArr.push('threadId.z'); + } else if (unrolled_lc === 'this.dimensions.x') { + retArr.push('uOutputDim.x'); + } else if (unrolled_lc === 'this.dimensions.y') { + retArr.push('uOutputDim.y'); + } else if (unrolled_lc === 'this.dimensions.z') { + retArr.push('uOutputDim.z'); + } else { + retArr.push(unrolled); + } + } + return retArr; + } + }, { + key: 'astSequenceExpression', + value: function astSequenceExpression(sNode, retArr, funcParam) { + for (var i = 0; i < sNode.expressions.length; i++) { + if (i > 0) { + retArr.push(','); + } + this.astGeneric(sNode.expressions, retArr, funcParam); + } + return retArr; + } + + + }, { + key: 'astMemberExpressionUnroll', + value: function astMemberExpressionUnroll(ast, funcParam) { + if (ast.type === 'Identifier') { + return ast.name; + } else if (ast.type === 'ThisExpression') { + return 'this'; + } + + if (ast.type === 'MemberExpression') { + if (ast.object && ast.property) { + return this.astMemberExpressionUnroll(ast.object, funcParam) + '.' + this.astMemberExpressionUnroll(ast.property, funcParam); + } + } + + throw astErrorOutput('Unknown CallExpression_unroll', ast, funcParam); + } + + + }, { + key: 'astCallExpression', + value: function astCallExpression(ast, retArr, funcParam) { + if (ast.callee) { + var funcName = this.astMemberExpressionUnroll(ast.callee); + + if (funcName.indexOf(jsMathPrefix) === 0) { + funcName = funcName.slice(jsMathPrefix.length); + } + + if (funcName.indexOf(localPrefix) === 0) { + funcName = funcName.slice(localPrefix.length); + } + + if (funcParam.calledFunctions.indexOf(funcName) < 0) { + funcParam.calledFunctions.push(funcName); + } + if (!funcParam.hasOwnProperty('funcName')) { + funcParam.calledFunctionsArguments[funcName] = []; + } + + var functionArguments = []; + funcParam.calledFunctionsArguments[funcName].push(functionArguments); + + retArr.push(funcName); + + retArr.push('('); + + for (var i = 0; i < ast.arguments.length; ++i) { + var argument = ast.arguments[i]; + if (i > 0) { + retArr.push(', '); + } + this.astGeneric(argument, retArr, funcParam); + if (argument.type === 'Identifier') { + var paramIndex = funcParam.paramNames.indexOf(argument.name); + if (paramIndex === -1) { + functionArguments.push(null); + } else { + functionArguments.push({ + name: argument.name, + type: funcParam.paramTypes[paramIndex] + }); + } + } else { + functionArguments.push(null); + } + } + + retArr.push(')'); + + return retArr; + } + + throw astErrorOutput('Unknown CallExpression', ast, funcParam); + + return retArr; + } + + + }, { + key: 'astArrayExpression', + value: function astArrayExpression(arrNode, retArr, funcParam) { + var arrLen = arrNode.elements.length; + + retArr.push('float[' + arrLen + ']('); + for (var i = 0; i < arrLen; ++i) { + if (i > 0) { + retArr.push(', '); + } + var subNode = arrNode.elements[i]; + this.astGeneric(subNode, retArr, funcParam); + } + retArr.push(')'); + + return retArr; + + } + + + }, { + key: 'getFunctionPrototypeString', + value: function getFunctionPrototypeString() { + if (this.webGlFunctionPrototypeString) { + return this.webGlFunctionPrototypeString; + } + return this.webGlFunctionPrototypeString = this.generate(); + } + }, { + key: 'build', + value: function build() { + return this.getFunctionPrototypeString().length > 0; + } + }], [{ + key: 'astFunctionPrototype', + value: function astFunctionPrototype(ast, retArr, funcParam) { + if (funcParam.isRootKernel || funcParam.isSubKernel) { + return retArr; + } + + retArr.push(funcParam.returnType); + retArr.push(' '); + retArr.push(funcParam.functionName); + retArr.push('('); + + for (var i = 0; i < funcParam.paramNames.length; ++i) { + if (i > 0) { + retArr.push(', '); + } + + retArr.push(funcParam.paramTypes[i]); + retArr.push(' '); + retArr.push('user_'); + retArr.push(funcParam.paramNames[i]); + } + + retArr.push(');\n'); + + return retArr; + } + }]); + + return WebGLFunctionNode; +}(FunctionNodeBase); + +function isIdentifierKernelParam(paramName, ast, funcParam) { + return funcParam.paramNames.indexOf(paramName) !== -1; +} + +function ensureIndentifierType(paramName, expectedType, ast, funcParam) { + var start = ast.loc.start; + + if (!isIdentifierKernelParam(paramName, funcParam) && expectedType !== 'float') { + throw 'Error unexpected identifier ' + paramName + ' on line ' + start.line; + } else { + var actualType = funcParam.paramTypes[funcParam.paramNames.indexOf(paramName)]; + if (actualType !== expectedType) { + throw 'Error unexpected identifier ' + paramName + ' on line ' + start.line; + } + } +} + +function webGlRegexOptimize(inStr) { + return inStr.replace(DECODE32_ENCODE32, '((').replace(ENCODE32_DECODE32, '(('); +} + +function astErrorOutput(error, ast, funcParam) { + console.error(error, ast, funcParam); + return error; +} +},{"../../core/utils":24,"../function-node-base":7}],13:[function(require,module,exports){ +'use strict'; + +var utils = require('../../core/utils'); +var kernelRunShortcut = require('../kernel-run-shortcut'); + +module.exports = function (gpuKernel, name) { + return '() => {\n ' + kernelRunShortcut.toString() + ';\n const utils = {\n allPropertiesOf: function ' + utils.allPropertiesOf.toString() + ',\n clone: function ' + utils.clone.toString() + ',\n splitArray: function ' + utils.splitArray.toString() + ',\n getArgumentType: function ' + utils.getArgumentType.toString() + ',\n getDimensions: function ' + utils.getDimensions.toString() + ',\n dimToTexSize: function ' + utils.dimToTexSize.toString() + ',\n copyFlatten: function ' + utils.copyFlatten.toString() + ',\n flatten: function ' + utils.flatten.toString() + ',\n systemEndianness: \'' + utils.systemEndianness() + '\',\n initWebGl: function ' + utils.initWebGl.toString() + ',\n isArray: function ' + utils.isArray.toString() + '\n };\n class ' + (name || 'Kernel') + ' {\n constructor() {\n this.argumentsLength = 0;\n this._canvas = null;\n this._webGl = null;\n this.built = false;\n this.program = null;\n this.paramNames = ' + JSON.stringify(gpuKernel.paramNames) + ';\n this.paramTypes = ' + JSON.stringify(gpuKernel.paramTypes) + ';\n this.texSize = ' + JSON.stringify(gpuKernel.texSize) + ';\n this.dimensions = ' + JSON.stringify(gpuKernel.dimensions) + ';\n this.compiledFragShaderString = `' + gpuKernel.compiledFragShaderString + '`;\n\t\t this.compiledVertShaderString = `' + gpuKernel.compiledVertShaderString + '`;\n\t\t this.programUniformLocationCache = {};\n\t\t this.textureCache = {};\n\t\t this.subKernelOutputTextures = null;\n }\n ' + gpuKernel._getFragShaderString.toString() + '\n ' + gpuKernel._getVertShaderString.toString() + '\n validateOptions() {}\n setupParams() {}\n setCanvas(canvas) { this._canvas = canvas; return this; }\n setWebGl(webGl) { this._webGl = webGl; return this; }\n ' + gpuKernel.getUniformLocation.toString() + '\n ' + gpuKernel.setupParams.toString() + '\n ' + gpuKernel.build.toString() + '\n\t\t ' + gpuKernel.run.toString() + '\n\t\t ' + gpuKernel._addArgument.toString() + '\n\t\t ' + gpuKernel.getArgumentTexture.toString() + '\n\t\t ' + gpuKernel.getTextureCache.toString() + '\n\t\t ' + gpuKernel.getOutputTexture.toString() + '\n\t\t ' + gpuKernel.renderOutput.toString() + '\n };\n return kernelRunShortcut(new Kernel());\n };'; +}; +},{"../../core/utils":24,"../kernel-run-shortcut":9}],14:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var fs = require('fs'); +var KernelBase = require('../kernel-base'); +var utils = require('../../core/utils'); +var Texture = require('../../core/texture'); +var fragShaderString = require('./shader-frag'); +var vertShaderString = require('./shader-vert'); +var kernelString = require('./kernel-string'); +var canvases = []; +var canvasTexSizes = {}; +module.exports = function (_KernelBase) { + _inherits(WebGLKernel, _KernelBase); + + function WebGLKernel(fnString, settings) { + _classCallCheck(this, WebGLKernel); + + var _this = _possibleConstructorReturn(this, (WebGLKernel.__proto__ || Object.getPrototypeOf(WebGLKernel)).call(this, fnString, settings)); + + _this.textureCache = {}; + _this.threadDim = {}; + _this.programUniformLocationCache = {}; + _this.framebuffer = null; + + _this.buffer = null; + _this.program = null; + _this.functionBuilder = settings.functionBuilder; + _this.outputToTexture = settings.outputToTexture; + _this.endianness = utils.systemEndianness(); + _this.subKernelOutputTextures = null; + _this.subKernelOutputVariableNames = null; + _this.paramTypes = null; + _this.argumentsLength = 0; + _this.ext = null; + _this.compiledFragShaderString = null; + _this.compiledVertShaderString = null; + _this.extDrawBuffersMap = null; + _this.outputTexture = null; + if (!_this._webGl) _this._webGl = utils.initWebGl(_this.getCanvas()); + return _this; + } + + + + _createClass(WebGLKernel, [{ + key: 'validateOptions', + value: function validateOptions() { + var isReadPixel = utils.isFloatReadPixelsSupported(); + if (this.floatTextures === true && !utils.OES_texture_float) { + throw 'Float textures are not supported on this browser'; + } else if (this.floatOutput === true && this.floatOutputForce !== true && !isReadPixel) { + throw 'Float texture outputs are not supported on this browser'; + } else if (this.floatTextures === null && !isReadPixel && !this.graphical) { + this.floatTextures = true; + this.floatOutput = false; + } + + if (!this.dimensions || this.dimensions.length === 0) { + if (arguments.length !== 1) { + throw 'Auto dimensions only supported for kernels with only one input'; + } + + var argType = utils.getArgumentType(arguments[0]); + if (argType === 'Array') { + this.dimensions = utils.getDimensions(argType); + } else if (argType === 'Texture') { + this.dimensions = arguments[0].dimensions; + } else { + throw 'Auto dimensions not supported for input type: ' + argType; + } + } + + this.texSize = utils.dimToTexSize({ + floatTextures: this.floatTextures, + floatOutput: this.floatOutput + }, this.dimensions, true); + + if (this.graphical) { + if (this.dimensions.length !== 2) { + throw 'Output must have 2 dimensions on graphical mode'; + } + + if (this.floatOutput) { + throw 'Cannot use graphical mode and float output at the same time'; + } + + this.texSize = utils.clone(this.dimensions); + } else if (this.floatOutput === undefined && utils.OES_texture_float) { + this.floatOutput = true; + } + } + + + }, { + key: 'build', + value: function build() { + this.validateOptions(); + this.setupParams(arguments); + var texSize = this.texSize; + var gl = this._webGl; + var canvas = this._canvas; + var canvasIndex = canvases.indexOf(canvas); + if (canvasIndex === -1) { + canvasIndex = canvases.length; + canvases.push(canvas); + canvasTexSizes[canvasIndex] = []; + } + + var sizes = canvasTexSizes[canvasIndex]; + sizes.push(texSize); + var maxTexSize = [0, 0]; + for (var i = 0; i < sizes.length; i++) { + var size = sizes[i]; + if (maxTexSize[0] < size[0]) { + maxTexSize[0] = size[0]; + } + if (maxTexSize[1] < size[1]) { + maxTexSize[1] = size[1]; + } + } + + gl.enable(gl.SCISSOR_TEST); + gl.viewport(0, 0, maxTexSize[0], maxTexSize[1]); + canvas.width = maxTexSize[0]; + canvas.height = maxTexSize[1]; + var threadDim = this.threadDim = utils.clone(this.dimensions); + while (threadDim.length < 3) { + threadDim.push(1); + } + + if (this.functionBuilder) this._addKernels(); + + var compiledVertShaderString = this._getVertShaderString(arguments); + var vertShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertShader, compiledVertShaderString); + gl.compileShader(vertShader); + + var compiledFragShaderString = this._getFragShaderString(arguments); + var fragShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragShader, compiledFragShaderString); + gl.compileShader(fragShader); + + if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) { + console.log(compiledVertShaderString); + console.error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(vertShader)); + throw 'Error compiling vertex shader'; + } + if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) { + console.log(compiledFragShaderString); + console.error('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(fragShader)); + throw 'Error compiling fragment shader'; + } + + if (this.debug) { + console.log('Options:'); + console.dir(this); + console.log('GLSL Shader Output:'); + console.log(compiledFragShaderString); + } + + var program = this.program = gl.createProgram(); + gl.attachShader(program, vertShader); + gl.attachShader(program, fragShader); + gl.linkProgram(program); + this.framebuffer = gl.createFramebuffer(); + this.framebuffer.width = texSize[0]; + this.framebuffer.height = texSize[1]; + + var vertices = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]); + var texCoords = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]); + + var texCoordOffset = vertices.byteLength; + + var buffer = this.buffer; + if (!buffer) { + buffer = this.buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, vertices.byteLength + texCoords.byteLength, gl.STATIC_DRAW); + } else { + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + } + + gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertices); + gl.bufferSubData(gl.ARRAY_BUFFER, texCoordOffset, texCoords); + + var aPosLoc = gl.getAttribLocation(this.program, 'aPos'); + gl.enableVertexAttribArray(aPosLoc); + gl.vertexAttribPointer(aPosLoc, 2, gl.FLOAT, gl.FALSE, 0, 0); + var aTexCoordLoc = gl.getAttribLocation(this.program, 'aTexCoord'); + gl.enableVertexAttribArray(aTexCoordLoc); + gl.vertexAttribPointer(aTexCoordLoc, 2, gl.FLOAT, gl.FALSE, 0, texCoordOffset); + + this.setupOutputTexture(); + + if (this.subKernelOutputTextures !== null) { + var extDrawBuffersMap = this.extDrawBuffersMap = [gl.COLOR_ATTACHMENT0]; + for (var _i = 0; _i < this.subKernelOutputTextures.length; _i++) { + var subKernelOutputTexture = this.subKernelOutputTextures[_i]; + extDrawBuffersMap.push(gl.COLOR_ATTACHMENT0 + _i + 1); + gl.activeTexture(gl.TEXTURE0 + arguments.length + _i); + gl.bindTexture(gl.TEXTURE_2D, subKernelOutputTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + if (this.floatOutput) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); + } else { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + } + } + } + + + }, { + key: 'run', + value: function run() { + if (this.program === null) { + this.build.apply(this, arguments); + } + var paramNames = this.paramNames; + var paramTypes = this.paramTypes; + var texSize = this.texSize; + var gl = this._webGl; + + gl.useProgram(this.program); + gl.scissor(0, 0, texSize[0], texSize[1]); + + if (!this.hardcodeConstants) { + var uOutputDimLoc = this.getUniformLocation('uOutputDim'); + gl.uniform3fv(uOutputDimLoc, this.threadDim); + var uTexSizeLoc = this.getUniformLocation('uTexSize'); + gl.uniform2fv(uTexSizeLoc, texSize); + } + + this.argumentsLength = 0; + for (var texIndex = 0; texIndex < paramNames.length; texIndex++) { + this._addArgument(arguments[texIndex], paramTypes[texIndex], paramNames[texIndex]); + } + + if (this.graphical) { + gl.bindRenderbuffer(gl.RENDERBUFFER, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + return; + } + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); + var outputTexture = this.outputTexture; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0); + + if (this.subKernelOutputTextures !== null) { + for (var i = 0; i < this.subKernelOutputTextures.length; i++) { + var subKernelOutputTexture = this.subKernelOutputTextures[i]; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, subKernelOutputTexture, 0); + } + this.ext.drawBuffersWEBGL(this.extDrawBuffersMap); + } + + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + if (this.subKernelOutputTextures !== null) { + if (this.subKernels !== null) { + var output = []; + output.result = this.renderOutput(outputTexture); + for (var _i2 = 0; _i2 < this.subKernels.length; _i2++) { + output.push(new Texture(this.subKernelOutputTextures[_i2], texSize, this.dimensions, this._webGl)); + } + return output; + } else if (this.subKernelProperties !== null) { + var _output = { + result: this.renderOutput(outputTexture) + }; + var _i3 = 0; + for (var p in this.subKernelProperties) { + if (!this.subKernelProperties.hasOwnProperty(p)) continue; + _output[p] = new Texture(this.subKernelOutputTextures[_i3], texSize, this.dimensions, this._webGl); + _i3++; + } + return _output; + } + } + + return this.renderOutput(outputTexture); + } + + + }, { + key: 'renderOutput', + value: function renderOutput(outputTexture) { + var texSize = this.texSize; + var gl = this._webGl; + var threadDim = this.threadDim; + + if (this.outputToTexture) { + return new Texture(outputTexture, texSize, this.dimensions, this._webGl); + } else { + var result = void 0; + if (this.floatOutput) { + result = new Float32Array(texSize[0] * texSize[1] * 4); + gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.FLOAT, result); + } else { + var bytes = new Uint8Array(texSize[0] * texSize[1] * 4); + gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, bytes); + result = new Float32Array(bytes.buffer); + } + + result = result.subarray(0, threadDim[0] * threadDim[1] * threadDim[2]); + + if (this.dimensions.length === 1) { + return result; + } else if (this.dimensions.length === 2) { + return utils.splitArray(result, this.dimensions[0]); + } else if (this.dimensions.length === 3) { + var cube = utils.splitArray(result, this.dimensions[0] * this.dimensions[1]); + return cube.map(function (x) { + return utils.splitArray(x, this.dimensions[0]); + }); + } + } + } + + + }, { + key: 'getOutputTexture', + value: function getOutputTexture() { + return this.getTextureCache('OUTPUT'); + } + + + }, { + key: 'detachOutputTexture', + value: function detachOutputTexture() { + this.detachTextureCache('OUTPUT'); + } + + + }, { + key: 'setupOutputTexture', + value: function setupOutputTexture() { + var gl = this._webGl; + var texSize = this.texSize; + this.detachOutputTexture(); + this.outputTexture = this.getOutputTexture(); + gl.activeTexture(gl.TEXTURE0 + this.paramNames.length); + gl.bindTexture(gl.TEXTURE_2D, this.outputTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + if (this.floatOutput) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); + } else { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + } + + + }, { + key: 'getArgumentTexture', + value: function getArgumentTexture(name) { + return this.getTextureCache('ARGUMENT_' + name); + } + + + }, { + key: 'getSubKernelTexture', + value: function getSubKernelTexture(name) { + return this.getTextureCache('SUB_KERNEL_' + name); + } + + + }, { + key: 'getTextureCache', + value: function getTextureCache(name) { + if (this.outputToTexture) { + return this._webGl.createTexture(); + } + if (this.textureCache.hasOwnProperty(name)) { + return this.textureCache[name]; + } + return this.textureCache[name] = this._webGl.createTexture(); + } + + + }, { + key: 'detachTextureCache', + value: function detachTextureCache(name) { + delete this.textureCache[name]; + } + + + }, { + key: 'setupParams', + value: function setupParams(args) { + var paramTypes = this.paramTypes = []; + for (var i = 0; i < args.length; i++) { + var param = args[i]; + var paramType = utils.getArgumentType(param); + paramTypes.push(paramType); + } + } + + + }, { + key: 'getUniformLocation', + value: function getUniformLocation(name) { + var location = this.programUniformLocationCache[name]; + if (!location) { + location = this._webGl.getUniformLocation(this.program, name); + this.programUniformLocationCache[name] = location; + } + return location; + } + + + }, { + key: '_getFragShaderArtifactMap', + value: function _getFragShaderArtifactMap(args) { + return { + HEADER: this._getHeaderString(), + LOOP_MAX: this._getLoopMaxString(), + CONSTANTS: this._getConstantsString(), + DECODE32_ENDIANNESS: this._getDecode32EndiannessString(), + ENCODE32_ENDIANNESS: this._getEncode32EndiannessString(), + GET_WRAPAROUND: this._getGetWraparoundString(), + GET_TEXTURE_CHANNEL: this._getGetTextureChannelString(), + GET_TEXTURE_INDEX: this._getGetTextureIndexString(), + GET_RESULT: this._getGetResultString(), + MAIN_PARAMS: this._getMainParamsString(args), + MAIN_CONSTANTS: this._getMainConstantsString(), + KERNEL: this._getKernelString(), + MAIN_RESULT: this._getMainResultString() + }; + } + + + }, { + key: '_addArgument', + value: function _addArgument(value, type, name) { + var gl = this._webGl; + var argumentTexture = this.getArgumentTexture(name); + if (value instanceof Texture) { + type = 'Texture'; + } + switch (type) { + case 'Array': + { + var dim = utils.getDimensions(value, true); + var size = utils.dimToTexSize({ + floatTextures: this.floatTextures, + floatOutput: this.floatOutput + }, dim); + gl.activeTexture(gl.TEXTURE0 + this.argumentsLength); + gl.bindTexture(gl.TEXTURE_2D, argumentTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + + var length = size[0] * size[1]; + if (this.floatTextures) { + length *= 4; + } + + var valuesFlat = new Float32Array(length); + utils.flattenTo(value, valuesFlat); + + var buffer = void 0; + if (this.floatTextures) { + buffer = new Float32Array(valuesFlat); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size[0], size[1], 0, gl.RGBA, gl.FLOAT, buffer); + } else { + buffer = new Uint8Array(new Float32Array(valuesFlat).buffer); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size[0], size[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, buffer); + } + + var loc = this.getUniformLocation('user_' + name); + var locSize = this.getUniformLocation('user_' + name + 'Size'); + var dimLoc = this.getUniformLocation('user_' + name + 'Dim'); + + if (!this.hardcodeConstants) { + gl.uniform3fv(dimLoc, dim); + gl.uniform2fv(locSize, size); + } + gl.uniform1i(loc, this.argumentsLength); + break; + } + case 'Number': + { + var _loc = this.getUniformLocation('user_' + name); + gl.uniform1f(_loc, value); + break; + } + case 'Texture': + { + var inputTexture = value; + var _dim = utils.getDimensions(inputTexture.dimensions, true); + var _size = inputTexture.size; + + if (inputTexture.texture === this.outputTexture) { + this.setupOutputTexture(); + } + + gl.activeTexture(gl.TEXTURE0 + this.argumentsLength); + gl.bindTexture(gl.TEXTURE_2D, inputTexture.texture); + + var _loc2 = this.getUniformLocation('user_' + name); + var _locSize = this.getUniformLocation('user_' + name + 'Size'); + var _dimLoc = this.getUniformLocation('user_' + name + 'Dim'); + + gl.uniform3fv(_dimLoc, _dim); + gl.uniform2fv(_locSize, _size); + gl.uniform1i(_loc2, this.argumentsLength); + break; + } + default: + throw 'Input type not supported (WebGL): ' + value; + } + this.argumentsLength++; + } + + + }, { + key: '_getHeaderString', + value: function _getHeaderString() { + return this.subKernels !== null || this.subKernelProperties !== null ? + '#extension GL_EXT_draw_buffers : require\n' : ''; + } + + + }, { + key: '_getLoopMaxString', + value: function _getLoopMaxString() { + return this.loopMaxIterations ? ' ' + parseInt(this.loopMaxIterations) + '.0;\n' : ' 100.0;\n'; + } + + + }, { + key: '_getConstantsString', + value: function _getConstantsString() { + var result = []; + var threadDim = this.threadDim; + var texSize = this.texSize; + if (this.hardcodeConstants) { + result.push('highp vec3 uOutputDim = vec3(' + threadDim[0] + ',' + threadDim[1] + ', ' + threadDim[2] + ')', 'highp vec2 uTexSize = vec2(' + texSize[0] + ', ' + texSize[1] + ')'); + } else { + result.push('uniform highp vec3 uOutputDim', 'uniform highp vec2 uTexSize'); + } + + return this._linesToString(result); + } + + + }, { + key: '_getTextureCoordinate', + value: function _getTextureCoordinate() { + var names = this.subKernelOutputVariableNames; + if (names === null || names.length < 1) { + return 'varying highp vec2 vTexCoord;\n'; + } else { + return 'out highp vec2 vTexCoord;\n'; + } + } + + + }, { + key: '_getDecode32EndiannessString', + value: function _getDecode32EndiannessString() { + return this.endianness === 'LE' ? '' : ' rgba.rgba = rgba.abgr;\n'; + } + + + }, { + key: '_getEncode32EndiannessString', + value: function _getEncode32EndiannessString() { + return this.endianness === 'LE' ? '' : ' rgba.rgba = rgba.abgr;\n'; + } + + + }, { + key: '_getGetWraparoundString', + value: function _getGetWraparoundString() { + return this.wraparound ? ' xyz = mod(xyz, texDim);\n' : ''; + } + + + }, { + key: '_getGetTextureChannelString', + value: function _getGetTextureChannelString() { + if (!this.floatTextures) return ''; + + return this._linesToString([' int channel = int(integerMod(index, 4.0))', ' index = float(int(index) / 4)']); + } + + + }, { + key: '_getGetTextureIndexString', + value: function _getGetTextureIndexString() { + return this.floatTextures ? ' index = float(int(index)/4);\n' : ''; + } + + + }, { + key: '_getGetResultString', + value: function _getGetResultString() { + if (!this.floatTextures) return ' return decode32(texel);\n'; + return this._linesToString([' if (channel == 0) return texel.r', ' if (channel == 1) return texel.g', ' if (channel == 2) return texel.b', ' if (channel == 3) return texel.a']); + } + + + }, { + key: '_getMainParamsString', + value: function _getMainParamsString(args) { + var result = []; + var paramTypes = this.paramTypes; + var paramNames = this.paramNames; + for (var i = 0; i < paramNames.length; i++) { + var param = args[i]; + var paramName = paramNames[i]; + var paramType = paramTypes[i]; + if (this.hardcodeConstants) { + if (paramType === 'Array' || paramType === 'Texture') { + var paramDim = utils.getDimensions(param, true); + var paramSize = utils.dimToTexSize({ + floatTextures: this.floatTextures, + floatOutput: this.floatOutput + }, paramDim); + + result.push('uniform highp sampler2D user_' + paramName, 'highp vec2 user_' + paramName + 'Size = vec2(' + paramSize[0] + '.0, ' + paramSize[1] + '.0)', 'highp vec3 user_' + paramName + 'Dim = vec3(' + paramDim[0] + '.0, ' + paramDim[1] + '.0, ' + paramDim[2] + '.0)'); + } else if (paramType === 'Number' && Number.isInteger(param)) { + result.push('highp float user_' + paramName + ' = ' + param + '.0'); + } else if (paramType === 'Number') { + result.push('highp float user_' + paramName + ' = ' + param); + } + } else { + if (paramType === 'Array' || paramType === 'Texture') { + result.push('uniform highp sampler2D user_' + paramName, 'uniform highp vec2 user_' + paramName + 'Size', 'uniform highp vec3 user_' + paramName + 'Dim'); + } else if (paramType === 'Number') { + result.push('uniform highp float user_' + paramName); + } + } + } + return this._linesToString(result); + } + + + }, { + key: '_getMainConstantsString', + value: function _getMainConstantsString() { + var result = []; + if (this.constants) { + for (var name in this.constants) { + if (!this.constants.hasOwnProperty(name)) continue; + var value = parseFloat(this.constants[name]); + + if (Number.isInteger(value)) { + result.push('const float constants_' + name + ' = ' + parseInt(value) + '.0'); + } else { + result.push('const float constants_' + name + ' = ' + parseFloat(value)); + } + } + } + return this._linesToString(result); + } + + + }, { + key: '_getKernelString', + value: function _getKernelString() { + var result = []; + var names = this.subKernelOutputVariableNames; + if (names !== null) { + result.push('highp float kernelResult = 0.0'); + for (var i = 0; i < names.length; i++) { + result.push('highp float ' + names[i] + ' = 0.0'); + } + + } else { + result.push('highp float kernelResult = 0.0'); + } + + return this._linesToString(result) + this.functionBuilder.getPrototypeString('kernel'); + } + + + }, { + key: '_getMainResultString', + value: function _getMainResultString() { + var names = this.subKernelOutputVariableNames; + var result = []; + if (this.floatOutput) { + result.push(' index *= 4.0'); + } + + if (this.graphical) { + result.push(' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor = actualColor'); + } else if (this.floatOutput) { + result.push(' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor.r = kernelResult', ' index += 1.0', ' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor.g = kernelResult', ' index += 1.0', ' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor.b = kernelResult', ' index += 1.0', ' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor.a = kernelResult'); + } else if (names !== null) { + result.push(' threadId = indexTo3D(index, uOutputDim)'); + result.push(' kernel()'); + result.push(' gl_FragData[0] = encode32(kernelResult)'); + for (var i = 0; i < names.length; i++) { + result.push(' gl_FragData[' + (i + 1) + '] = encode32(' + names[i] + ')'); + } + } else { + result.push(' threadId = indexTo3D(index, uOutputDim)', ' kernel()', ' gl_FragColor = encode32(kernelResult)'); + } + + return this._linesToString(result); + } + + + }, { + key: '_linesToString', + value: function _linesToString(lines) { + if (lines.length > 0) { + return lines.join(';\n') + ';\n'; + } else { + return '\n'; + } + } + + + }, { + key: '_replaceArtifacts', + value: function _replaceArtifacts(src, map) { + return src.replace(/[ ]*__([A-Z]+[0-9]*([_]?[A-Z])*)__;\n/g, function (match, artifact) { + if (map.hasOwnProperty(artifact)) { + return map[artifact]; + } + throw 'unhandled artifact ' + artifact; + }); + } + + + }, { + key: '_addKernels', + value: function _addKernels() { + var builder = this.functionBuilder; + var gl = this._webGl; + builder.addKernel(this.fnString, { + prototypeOnly: false, + constants: this.constants, + debug: this.debug, + loopMaxIterations: this.loopMaxIterations + }, this.paramNames, this.paramTypes); + + if (this.subKernels !== null) { + var ext = this.ext = gl.getExtension('WEBGL_draw_buffers'); + if (!ext) throw new Error('could not instantiate draw buffers extension'); + this.subKernelOutputTextures = []; + this.subKernelOutputVariableNames = []; + for (var i = 0; i < this.subKernels.length; i++) { + var subKernel = this.subKernels[i]; + builder.addSubKernel(subKernel, { + prototypeOnly: false, + constants: this.constants, + debug: this.debug, + loopMaxIterations: this.loopMaxIterations + }); + this.subKernelOutputTextures.push(this.getSubKernelTexture(i)); + this.subKernelOutputVariableNames.push(subKernel.name + 'Result'); + } + } else if (this.subKernelProperties !== null) { + var _ext = this.ext = gl.getExtension('WEBGL_draw_buffers'); + if (!_ext) throw new Error('could not instantiate draw buffers extension'); + this.subKernelOutputTextures = []; + this.subKernelOutputVariableNames = []; + var _i4 = 0; + for (var p in this.subKernelProperties) { + if (!this.subKernelProperties.hasOwnProperty(p)) continue; + var _subKernel = this.subKernelProperties[p]; + builder.addSubKernel(_subKernel, { + prototypeOnly: false, + constants: this.constants, + debug: this.debug, + loopMaxIterations: this.loopMaxIterations + }); + this.subKernelOutputTextures.push(this.getSubKernelTexture(p)); + this.subKernelOutputVariableNames.push(_subKernel.name + 'Result'); + _i4++; + } + } + } + + + }, { + key: '_getFragShaderString', + value: function _getFragShaderString(args) { + if (this.compiledFragShaderString !== null) { + return this.compiledFragShaderString; + } + return this.compiledFragShaderString = this._replaceArtifacts(fragShaderString, this._getFragShaderArtifactMap(args)); + } + + + }, { + key: '_getVertShaderString', + value: function _getVertShaderString(args) { + if (this.compiledVertShaderString !== null) { + return this.compiledVertShaderString; + } + return this.compiledVertShaderString = vertShaderString; + } + + + }, { + key: 'toString', + value: function toString() { + return kernelString(this); + } + }]); + + return WebGLKernel; +}(KernelBase); +},{"../../core/texture":22,"../../core/utils":24,"../kernel-base":8,"./kernel-string":13,"./shader-frag":16,"./shader-vert":17,"fs":27}],15:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var RunnerBase = require('../runner-base'); +var WebGLKernel = require('./kernel'); +var utils = require('../../core/utils'); +var WebGLFunctionBuilder = require('./function-builder'); + +module.exports = function (_RunnerBase) { + _inherits(WebGLRunner, _RunnerBase); + + function WebGLRunner(settings) { + _classCallCheck(this, WebGLRunner); + + var _this = _possibleConstructorReturn(this, (WebGLRunner.__proto__ || Object.getPrototypeOf(WebGLRunner)).call(this, new WebGLFunctionBuilder(), settings)); + + _this.Kernel = WebGLKernel; + _this.kernel = null; + return _this; + } + + + + _createClass(WebGLRunner, [{ + key: 'getMode', + value: function getMode() { + return 'gpu'; + } + }]); + + return WebGLRunner; +}(RunnerBase); +},{"../../core/utils":24,"../runner-base":10,"./function-builder":11,"./kernel":14}],16:[function(require,module,exports){ +"use strict"; + +module.exports = "__HEADER__;\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\nconst float LOOP_MAX = __LOOP_MAX__;\n#define EPSILON 0.0000001;\n\n__CONSTANTS__;\n\nvarying highp vec2 vTexCoord;\n\nvec4 round(vec4 x) {\n return floor(x + 0.5);\n}\n\nhighp float round(highp float x) {\n return floor(x + 0.5);\n}\n\nvec2 integerMod(vec2 x, float y) {\n vec2 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec3 integerMod(vec3 x, float y) {\n vec3 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec4 integerMod(vec4 x, vec4 y) {\n vec4 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nhighp float integerMod(highp float x, highp float y) {\n highp float res = floor(mod(x, y));\n return res * (res > floor(y) - 1.0 ? 0.0 : 1.0);\n}\n\nhighp int integerMod(highp int x, highp int y) {\n return int(integerMod(float(x), float(y)));\n}\n\n// Here be dragons!\n// DO NOT OPTIMIZE THIS CODE\n// YOU WILL BREAK SOMETHING ON SOMEBODY'S MACHINE\n// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME\nconst vec2 MAGIC_VEC = vec2(1.0, -256.0);\nconst vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0);\nconst vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536\nhighp float decode32(highp vec4 rgba) {\n __DECODE32_ENDIANNESS__;\n rgba *= 255.0;\n vec2 gte128;\n gte128.x = rgba.b >= 128.0 ? 1.0 : 0.0;\n gte128.y = rgba.a >= 128.0 ? 1.0 : 0.0;\n float exponent = 2.0 * rgba.a - 127.0 + dot(gte128, MAGIC_VEC);\n float res = exp2(round(exponent));\n rgba.b = rgba.b - 128.0 * gte128.x;\n res = dot(rgba, SCALE_FACTOR) * exp2(round(exponent-23.0)) + res;\n res *= gte128.y * -2.0 + 1.0;\n return res;\n}\n\nhighp vec4 encode32(highp float f) {\n highp float F = abs(f);\n highp float sign = f < 0.0 ? 1.0 : 0.0;\n highp float exponent = floor(log2(F));\n highp float mantissa = (exp2(-exponent) * F);\n // exponent += floor(log2(mantissa));\n vec4 rgba = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV;\n rgba.rg = integerMod(rgba.rg, 256.0);\n rgba.b = integerMod(rgba.b, 128.0);\n rgba.a = exponent*0.5 + 63.5;\n rgba.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0;\n rgba = floor(rgba);\n rgba *= 0.003921569; // 1/255\n __ENCODE32_ENDIANNESS__;\n return rgba;\n}\n// Dragons end here\n\nhighp float index;\nhighp vec3 threadId;\n\nhighp vec3 indexTo3D(highp float idx, highp vec3 texDim) {\n highp float z = floor(idx / (texDim.x * texDim.y));\n idx -= z * texDim.x * texDim.y;\n highp float y = floor(idx / texDim.x);\n highp float x = integerMod(idx, texDim.x);\n return vec3(x, y, z);\n}\n\nhighp float get(highp sampler2D tex, highp vec2 texSize, highp vec3 texDim, highp float z, highp float y, highp float x) {\n highp vec3 xyz = vec3(x, y, z);\n xyz = floor(xyz + 0.5);\n __GET_WRAPAROUND__;\n highp float index = round(xyz.x + texDim.x * (xyz.y + texDim.y * xyz.z));\n __GET_TEXTURE_CHANNEL__;\n highp float w = round(texSize.x);\n vec2 st = vec2(integerMod(index, w), float(int(index) / int(w))) + 0.5;\n __GET_TEXTURE_INDEX__;\n highp vec4 texel = texture2D(tex, st / texSize);\n __GET_RESULT__;\n}\n\nhighp float get(highp sampler2D tex, highp vec2 texSize, highp vec3 texDim, highp float y, highp float x) {\n return get(tex, texSize, texDim, 0.0, y, x);\n}\n\nhighp float get(highp sampler2D tex, highp vec2 texSize, highp vec3 texDim, highp float x) {\n return get(tex, texSize, texDim, 0.0, 0.0, x);\n}\n\nhighp vec4 actualColor;\nvoid color(float r, float g, float b, float a) {\n actualColor = vec4(r,g,b,a);\n}\n\nvoid color(float r, float g, float b) {\n color(r,g,b,1.0);\n}\n\n__MAIN_PARAMS__;\n__MAIN_CONSTANTS__;\n__KERNEL__;\n\nvoid main(void) {\n index = floor(vTexCoord.s * float(uTexSize.x)) + floor(vTexCoord.t * float(uTexSize.y)) * uTexSize.x;\n __MAIN_RESULT__;\n}"; +},{}],17:[function(require,module,exports){ +"use strict"; + +module.exports = "precision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\nattribute highp vec2 aPos;\nattribute highp vec2 aTexCoord;\n\nvarying highp vec2 vTexCoord;\n\nvoid main(void) {\n gl_Position = vec4(aPos, 0, 1);\n vTexCoord = aTexCoord;\n}"; +},{}],18:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var WebGLKernel = require('./kernel'); +var utils = require('../../core/utils'); + +module.exports = function (_WebGLKernel) { + _inherits(WebGLValidatorKernel, _WebGLKernel); + + function WebGLValidatorKernel() { + _classCallCheck(this, WebGLValidatorKernel); + + return _possibleConstructorReturn(this, (WebGLValidatorKernel.__proto__ || Object.getPrototypeOf(WebGLValidatorKernel)).apply(this, arguments)); + } + + _createClass(WebGLValidatorKernel, [{ + key: 'validateOptions', + + + value: function validateOptions() { + this.texSize = utils.dimToTexSize({ + floatTextures: this.floatTextures, + floatOutput: this.floatOutput + }, this.dimensions, true); + } + }]); + + return WebGLValidatorKernel; +}(WebGLKernel); +},{"../../core/utils":24,"./kernel":14}],19:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +module.exports = function alias(name, fn) { + var fnString = fn.toString(); + return new Function('return function ' + name + ' (' + utils.getParamNamesFromString(fnString).join(', ') + ') {' + utils.getFunctionBodyFromString(fnString) + '}')(); +}; +},{"./utils":24}],20:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var UtilsCore = require("./utils-core"); + +module.exports = function () { + function GPUCore() { + _classCallCheck(this, GPUCore); + } + + _createClass(GPUCore, null, [{ + key: "validateKernelObj", + + + value: function validateKernelObj(kernelObj) { + + if (kernelObj == null) { + throw "KernelObj being validated is NULL"; + } + + if (typeof kernelObj === "string") { + try { + kernelObj = JSON.parse(kernelObj); + } catch (e) { + console.error(e); + throw "Failed to convert KernelObj from JSON string"; + } + + if (kernelObj == null) { + throw "Invalid (NULL) KernelObj JSON string representation"; + } + } + + if (kernelObj.isKernelObj != true) { + throw "Failed missing isKernelObj flag check"; + } + + return kernelObj; + } + + + }, { + key: "loadKernelObj", + value: function loadKernelObj(kernelObj, inOpt) { + + kernelObj = validateKernelObj(kernelObj); + } + }]); + + return GPUCore; +}(); +},{"./utils-core":23}],21:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var utils = require('./utils'); +var WebGLRunner = require('../backend/web-gl/runner'); +var CPURunner = require('../backend/cpu/runner'); +var WebGLValidatorKernel = require('../backend/web-gl/validator-kernel'); +var GPUCore = require("./gpu-core"); + + +var GPU = function (_GPUCore) { + _inherits(GPU, _GPUCore); + + function GPU(settings) { + _classCallCheck(this, GPU); + + var _this = _possibleConstructorReturn(this, (GPU.__proto__ || Object.getPrototypeOf(GPU)).call(this, settings)); + + settings = settings || {}; + _this._canvas = settings.canvas || null; + _this._webGl = settings.webGl || null; + var mode = settings.mode || 'webgl'; + if (!utils.isWebGlSupported()) { + console.warn('Warning: gpu not supported, falling back to cpu support'); + mode = 'cpu'; + } + + _this.kernels = []; + + var runnerSettings = { + canvas: _this._canvas, + webGl: _this._webGl + }; + + if (mode) { + switch (mode.toLowerCase()) { + case 'cpu': + _this._runner = new CPURunner(runnerSettings); + break; + case 'gpu': + case 'webgl': + _this._runner = new WebGLRunner(runnerSettings); + break; + case 'webgl-validator': + _this._runner = new WebGLRunner(runnerSettings); + _this._runner.Kernel = WebGLValidatorKernel; + break; + default: + throw new Error('"' + mode + '" mode is not defined'); + } + } + return _this; + } + + + _createClass(GPU, [{ + key: 'createKernel', + value: function createKernel(fn, settings) { + if (typeof fn === 'undefined') { + throw 'Missing fn parameter'; + } + if (!utils.isFunction(fn)) { + throw 'fn parameter not a function'; + } + + var kernel = this._runner.buildKernel(fn, settings || {}); + + if (!this._canvas) { + this._canvas = kernel.getCanvas(); + } + if (!this._runner.canvas) { + this._runner.canvas = kernel.getCanvas(); + } + + this.kernels.push(kernel); + + return kernel; + } + + + }, { + key: 'createKernelMap', + value: function createKernelMap() { + var fn = void 0; + var settings = void 0; + if (typeof arguments[arguments.length - 2] === 'function') { + fn = arguments[arguments.length - 2]; + settings = arguments[arguments.length - 1]; + } else { + fn = arguments[arguments.length - 1]; + } + + if (!utils.isWebGlDrawBuffersSupported()) { + this._runner = new CPURunner(settings); + } + + var kernel = this.createKernel(fn, settings); + if (Array.isArray(arguments[0])) { + var functions = arguments[0]; + for (var i = 0; i < functions.length; i++) { + kernel.addSubKernel(functions[i]); + } + } else { + var _functions = arguments[0]; + for (var p in _functions) { + if (!_functions.hasOwnProperty(p)) continue; + kernel.addSubKernelProperty(p, _functions[p]); + } + } + + return kernel; + } + + + }, { + key: 'combineKernels', + value: function combineKernels() { + var lastKernel = arguments[arguments.length - 2]; + var combinedKernel = arguments[arguments.length - 1]; + if (this.getMode() === 'cpu') return combinedKernel; + + var canvas = arguments[0].getCanvas(); + var webGl = arguments[0].getWebGl(); + + for (var i = 0; i < arguments.length - 1; i++) { + arguments[i].setCanvas(canvas).setWebGl(webGl).setOutputToTexture(true); + } + + return function () { + combinedKernel.apply(null, arguments); + var texSize = lastKernel.texSize; + var gl = lastKernel.getWebGl(); + var threadDim = lastKernel.threadDim; + var result = void 0; + if (lastKernel.floatOutput) { + result = new Float32Array(texSize[0] * texSize[1] * 4); + gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.FLOAT, result); + } else { + var bytes = new Uint8Array(texSize[0] * texSize[1] * 4); + gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, bytes); + result = new Float32Array(bytes.buffer); + } + + result = result.subarray(0, threadDim[0] * threadDim[1] * threadDim[2]); + + if (lastKernel.dimensions.length === 1) { + return result; + } else if (lastKernel.dimensions.length === 2) { + return utils.splitArray(result, lastKernel.dimensions[0]); + } else if (lastKernel.dimensions.length === 3) { + var cube = utils.splitArray(result, lastKernel.dimensions[0] * lastKernel.dimensions[1]); + return cube.map(function (x) { + return utils.splitArray(x, lastKernel.dimensions[0]); + }); + } + }; + } + + + }, { + key: 'addFunction', + value: function addFunction(fn, paramTypes, returnType) { + this._runner.functionBuilder.addFunction(null, fn, paramTypes, returnType); + return this; + } + + + }, { + key: 'getMode', + value: function getMode() { + return this._runner.getMode(); + } + + + }, { + key: 'isWebGlSupported', + value: function isWebGlSupported() { + return utils.isWebGlSupported(); + } + + + }, { + key: 'getCanvas', + value: function getCanvas() { + return this._canvas; + } + + + }, { + key: 'getWebGl', + value: function getWebGl() { + return this._webGl; + } + }]); + + return GPU; +}(GPUCore); + +; + +Object.assign(GPU, GPUCore); + +module.exports = GPU; +},{"../backend/cpu/runner":5,"../backend/web-gl/runner":15,"../backend/web-gl/validator-kernel":18,"./gpu-core":20,"./utils":24}],22:[function(require,module,exports){ +'use strict'; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var gpu = null; + +module.exports = function () { + + function Texture(texture, size, dimensions, webGl) { + _classCallCheck(this, Texture); + + this.texture = texture; + this.size = size; + this.dimensions = dimensions; + this.webGl = webGl; + this.kernel = null; + } + + + + _createClass(Texture, [{ + key: 'toArray', + value: function toArray(gpu) { + if (!gpu) throw new Error('You need to pass the GPU object for toArray to work.'); + if (this.kernel) return this.kernel(this); + + this.kernel = gpu.createKernel(function (x) { + return x[this.thread.z][this.thread.y][this.thread.x]; + }).setDimensions(this.dimensions); + + return this.kernel(this); + } + + + }, { + key: 'delete', + value: function _delete() { + return this.webGl.deleteTexture(this.texture); + } + }]); + + return Texture; +}(); +},{}],23:[function(require,module,exports){ +'use strict'; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var UtilsCore = function () { + function UtilsCore() { + _classCallCheck(this, UtilsCore); + } + + _createClass(UtilsCore, null, [{ + key: 'isCanvas', + + + + + + value: function isCanvas(canvasObj) { + return canvasObj !== null && canvasObj.nodeName && canvasObj.getContext && canvasObj.nodeName.toUpperCase() === 'CANVAS'; + } + + + }, { + key: 'isCanvasSupported', + value: function isCanvasSupported() { + return _isCanvasSupported; + } + + + }, { + key: 'initCanvas', + value: function initCanvas() { + if (!_isCanvasSupported) { + return null; + } + + var canvas = document.createElement('canvas'); + + canvas.width = 2; + canvas.height = 2; + + return canvas; + } + + + + + }, { + key: 'isWebGl', + value: function isWebGl(webGlObj) { + return webGlObj && typeof webGlObj.getExtension === 'function'; + } + + + }, { + key: 'isWebGlSupported', + value: function isWebGlSupported() { + return _isWebGlSupported; + } + }, { + key: 'isWebGlDrawBuffersSupported', + value: function isWebGlDrawBuffersSupported() { + return _isWebGlDrawBuffersSupported; + } + + + }, { + key: 'initWebGlDefaultOptions', + value: function initWebGlDefaultOptions() { + return { + alpha: false, + depth: false, + antialias: false + }; + } + + + }, { + key: 'initWebGl', + value: function initWebGl(canvasObj) { + + if (typeof _isCanvasSupported !== 'undefined' || canvasObj === null) { + if (!_isCanvasSupported) { + return null; + } + } + + if (!UtilsCore.isCanvas(canvasObj)) { + throw new Error('Invalid canvas object - ' + canvasObj); + } + + var webGl = canvasObj.getContext('experimental-webgl', UtilsCore.initWebGlDefaultOptions()) || canvasObj.getContext('webgl', UtilsCore.initWebGlDefaultOptions()); + + if (webGl) { + webGl.OES_texture_float = webGl.getExtension('OES_texture_float'); + webGl.OES_texture_float_linear = webGl.getExtension('OES_texture_float_linear'); + webGl.OES_element_index_uint = webGl.getExtension('OES_element_index_uint'); + } + + return webGl; + } + }]); + + return UtilsCore; +}(); + + +var _isCanvasSupported = typeof document !== 'undefined' ? UtilsCore.isCanvas(document.createElement('canvas')) : false; +var _testingWebGl = UtilsCore.initWebGl(UtilsCore.initCanvas()); +var _isWebGlSupported = UtilsCore.isWebGl(_testingWebGl); +var _isWebGlDrawBuffersSupported = _isWebGlSupported && Boolean(_testingWebGl.getExtension('WEBGL_draw_buffers')); + +if (_isWebGlSupported) { + UtilsCore.OES_texture_float = _testingWebGl.OES_texture_float; + UtilsCore.OES_texture_float_linear = _testingWebGl.OES_texture_float_linear; + UtilsCore.OES_element_index_uint = _testingWebGl.OES_element_index_uint; +} else { + UtilsCore.OES_texture_float = false; + UtilsCore.OES_texture_float_linear = false; + UtilsCore.OES_element_index_uint = false; +} + +module.exports = UtilsCore; +},{}],24:[function(require,module,exports){ +'use strict'; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var UtilsCore = require("./utils-core"); +var Texture = require('./texture'); +var FUNCTION_NAME = /function ([^(]*)/; + +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; + +var ARGUMENT_NAMES = /([^\s,]+)/g; + +var _systemEndianness = function () { + var b = new ArrayBuffer(4); + var a = new Uint32Array(b); + var c = new Uint8Array(b); + a[0] = 0xdeadbeef; + if (c[0] === 0xef) return 'LE'; + if (c[0] === 0xde) return 'BE'; + throw new Error('unknown endianness'); +}(); + +var _isFloatReadPixelsSupported = null; + +var Utils = function (_UtilsCore) { + _inherits(Utils, _UtilsCore); + + function Utils() { + _classCallCheck(this, Utils); + + return _possibleConstructorReturn(this, (Utils.__proto__ || Object.getPrototypeOf(Utils)).apply(this, arguments)); + } + + _createClass(Utils, null, [{ + key: 'systemEndianness', + + + + value: function systemEndianness() { + return _systemEndianness; + } + + + + }, { + key: 'isFunction', + value: function isFunction(funcObj) { + return typeof funcObj === 'function'; + } + + + }, { + key: 'isFunctionString', + value: function isFunctionString(funcStr) { + if (funcStr !== null) { + return funcStr.toString().slice(0, 'function'.length).toLowerCase() === 'function'; + } + return false; + } + + + }, { + key: 'getFunctionNameFromString', + value: function getFunctionNameFromString(funcStr) { + return FUNCTION_NAME.exec(funcStr)[1]; + } + }, { + key: 'getFunctionBodyFromString', + value: function getFunctionBodyFromString(funcStr) { + return funcStr.substring(funcStr.indexOf('{') + 1, funcStr.lastIndexOf('}')); + } + + + }, { + key: 'getParamNamesFromString', + value: function getParamNamesFromString(func) { + var fnStr = func.toString().replace(STRIP_COMMENTS, ''); + var result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); + if (result === null) result = []; + return result; + } + + + + }, { + key: 'clone', + value: function clone(obj) { + if (obj === null || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj.hasOwnProperty('isActiveClone')) return obj; + + var temp = obj.constructor(); + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + obj.isActiveClone = null; + temp[key] = Utils.clone(obj[key]); + delete obj.isActiveClone; + } + } + + return temp; + } + + + }, { + key: 'newPromise', + value: function newPromise(executor) { + var simple = Promise || small_promise; + if (simple === null) { + throw TypeError('Browser is missing Promise implementation. Consider adding small_promise.js polyfill'); + } + return new simple(executor); + } + + + }, { + key: 'functionBinder', + value: function functionBinder(inFunc, thisObj) { + if (inFunc.bind) { + return inFunc.bind(thisObj); + } + + return function () { + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments); + return inFunc.apply(thisObj, args); + }; + } + + + }, { + key: 'isArray', + value: function isArray(array) { + if (isNaN(array.length)) { + return false; + } + + return true; + } + + + }, { + key: 'getArgumentType', + value: function getArgumentType(arg) { + if (Utils.isArray(arg)) { + return 'Array'; + } else if (typeof arg === 'number') { + return 'Number'; + } else if (arg instanceof Texture) { + return 'Texture'; + } else { + return 'Unknown'; + } + } + + + }, { + key: 'isFloatReadPixelsSupported', + value: function isFloatReadPixelsSupported() { + if (_isFloatReadPixelsSupported !== null) { + return _isFloatReadPixelsSupported; + } + + var GPU = require('../index'); + var x = new GPU({ + mode: 'webgl-validator' + }).createKernel(function () { + return 1; + }, { + dimensions: [2], + floatTextures: true, + floatOutput: true, + floatOutputForce: true + })(); + + _isFloatReadPixelsSupported = x[0] === 1; + + return _isFloatReadPixelsSupported; + } + }, { + key: 'dimToTexSize', + value: function dimToTexSize(opt, dimensions, output) { + var numTexels = dimensions[0]; + for (var i = 1; i < dimensions.length; i++) { + numTexels *= dimensions[i]; + } + + if (opt.floatTextures && (!output || opt.floatOutput)) { + numTexels = Math.ceil(numTexels / 4); + } + + var w = Math.ceil(Math.sqrt(numTexels)); + return [w, w]; + } + + + }, { + key: 'getDimensions', + value: function getDimensions(x, pad) { + var ret = void 0; + if (Utils.isArray(x)) { + var dim = []; + var temp = x; + while (Utils.isArray(temp)) { + dim.push(temp.length); + temp = temp[0]; + } + ret = dim.reverse(); + } else if (x instanceof Texture) { + ret = x.dimensions; + } else { + throw 'Unknown dimensions of ' + x; + } + + if (pad) { + ret = Utils.clone(ret); + while (ret.length < 3) { + ret.push(1); + } + } + + return ret; + } + + + }, { + key: 'pad', + value: function pad(arr, padding) { + function zeros(n) { + return Array.apply(null, new Array(n)).map(Number.prototype.valueOf, 0); + } + + var len = arr.length + padding * 2; + + var ret = arr.map(function (x) { + return [].concat(zeros(padding), x, zeros(padding)); + }); + + for (var i = 0; i < padding; i++) { + ret = [].concat([zeros(len)], ret, [zeros(len)]); + } + + return ret; + } + + + }, { + key: 'flatten2dArrayTo', + value: function flatten2dArrayTo(array, target) { + var offset = 0; + for (var y = 0; y < array.length; y++) { + target.set(array[y], offset); + offset += array[y].length; + } + } + + + }, { + key: 'flatten3dArrayTo', + value: function flatten3dArrayTo(array, target) { + var offset = 0; + for (var z = 0; z < array.length; z++) { + for (var y = 0; y < array[z].length; y++) { + target.set(array[z][y], offset); + offset += array[z][y].length; + } + } + } + + + }, { + key: 'flattenTo', + value: function flattenTo(array, target) { + if (Utils.isArray(array[0])) { + if (Utils.isArray(array[0][0])) { + Utils.flatten3dArrayTo(array, target); + } else { + Utils.flatten2dArrayTo(array, target); + } + } else { + target.set(array); + } + } + + + }, { + key: 'splitArray', + value: function splitArray(array, part) { + var result = []; + for (var i = 0; i < array.length; i += part) { + result.push(Array.prototype.slice.call(array, i, i + part)); + } + return result; + } + }, { + key: 'getAstString', + value: function getAstString(source, ast) { + var lines = Array.isArray(source) ? source : source.split(/\r?\n/g); + var start = ast.loc.start; + var end = ast.loc.end; + var result = []; + result.push(lines[start.line - 1].slice(start.column)); + for (var i = start.line; i < end.line - 1; i++) { + result.push(lines[i]); + } + result.push(lines[end.line - 1].slice(0, end.column)); + return result.join('\n'); + } + }, { + key: 'allPropertiesOf', + value: function allPropertiesOf(obj) { + var props = []; + + do { + props.push.apply(props, Object.getOwnPropertyNames(obj)); + } while (obj = Object.getPrototypeOf(obj)); + + return props; + } + }]); + + return Utils; +}(UtilsCore); + + + +Object.assign(Utils, UtilsCore); + +module.exports = Utils; +},{"../index":25,"./texture":22,"./utils-core":23}],25:[function(require,module,exports){ +'use strict'; + +var GPU = require('./core/gpu'); +var alias = require('./core/alias'); +var utils = require('./core/utils'); + +var CPUFunctionBuilder = require('./backend/cpu/function-builder'); +var CPUFunctionNode = require('./backend/cpu/function-node'); +var CPUKernel = require('./backend/cpu/kernel'); +var CPURunner = require('./backend/cpu/runner'); + +var WebGLFunctionBuilder = require('./backend/web-gl/function-builder'); +var WebGLFunctionNode = require('./backend/web-gl/function-node'); +var WebGLKernel = require('./backend/web-gl/kernel'); +var WebGLRunner = require('./backend/web-gl/runner'); + +GPU.alias = alias; +GPU.utils = utils; + +GPU.CPUFunctionBuilder = CPUFunctionBuilder; +GPU.CPUFunctionNode = CPUFunctionNode; +GPU.CPUKernel = CPUKernel; +GPU.CPURunner = CPURunner; + +GPU.WebGLFunctionBuilder = WebGLFunctionBuilder; +GPU.WebGLFunctionNode = WebGLFunctionNode; +GPU.WebGLKernel = WebGLKernel; +GPU.WebGLRunner = WebGLRunner; + +if (typeof module !== 'undefined') { + module.exports = GPU; +} +if (typeof window !== 'undefined') { + window.GPU = GPU; +} +},{"./backend/cpu/function-builder":1,"./backend/cpu/function-node":2,"./backend/cpu/kernel":4,"./backend/cpu/runner":5,"./backend/web-gl/function-builder":11,"./backend/web-gl/function-node":12,"./backend/web-gl/kernel":14,"./backend/web-gl/runner":15,"./core/alias":19,"./core/gpu":21,"./core/utils":24}],26:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.acorn = global.acorn || {}))); +}(this, (function (exports) { 'use strict'; + + +var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" +}; + + +var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + +var keywords = { + 5: ecma5AndLessKeywords, + 6: ecma5AndLessKeywords + " const class extends export import super" +}; + + + +var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + +var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + + +var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541]; + +var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239]; + +function isInAstralSet(code, set) { + var pos = 0x10000; + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) { return false } + pos += set[i + 1]; + if (pos >= code) { return true } + } +} + + +function isIdentifierStart(code, astral) { + if (code < 65) { return code === 36 } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) +} + + +function isIdentifierChar(code, astral) { + if (code < 48) { return code === 36 } + if (code < 58) { return true } + if (code < 65) { return false } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) +} + + + + + +var TokenType = function TokenType(label, conf) { + if ( conf === void 0 ) conf = {}; + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; +}; + +function binop(name, prec) { + return new TokenType(name, {beforeExpr: true, binop: prec}) +} +var beforeExpr = {beforeExpr: true}; +var startsExpr = {startsExpr: true}; + + +var keywords$1 = {}; + +function kw(name, options) { + if ( options === void 0 ) options = {}; + + options.keyword = name; + return keywords$1[name] = new TokenType(name, options) +} + +var types = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + eof: new TokenType("eof"), + + bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), + bracketR: new TokenType("]"), + braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), + braceR: new TokenType("}"), + parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), + + + eq: new TokenType("=", {beforeExpr: true, isAssign: true}), + assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), + incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), + prefix: new TokenType("prefix", {beforeExpr: true, prefix: true, startsExpr: true}), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=", 6), + relational: binop("", 7), + bitShift: binop("<>", 8), + plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", {beforeExpr: true}), + + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", {isLoop: true, beforeExpr: true}), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", {isLoop: true}), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", {isLoop: true}), + _with: kw("with"), + _new: kw("new", {beforeExpr: true, startsExpr: true}), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import"), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", {beforeExpr: true, binop: 7}), + _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), + _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), + _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), + _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) +}; + + +var lineBreak = /\r\n?|\n|\u2028|\u2029/; +var lineBreakG = new RegExp(lineBreak.source, "g"); + +function isNewLine(code) { + return code === 10 || code === 13 || code === 0x2028 || code === 0x2029 +} + +var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + +var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + +var ref = Object.prototype; +var hasOwnProperty = ref.hasOwnProperty; +var toString = ref.toString; + + +function has(obj, propName) { + return hasOwnProperty.call(obj, propName) +} + +var isArray = Array.isArray || (function (obj) { return ( + toString.call(obj) === "[object Array]" +); }); + + +var Position = function Position(line, col) { + this.line = line; + this.column = col; +}; + +Position.prototype.offset = function offset (n) { + return new Position(this.line, this.column + n) +}; + +var SourceLocation = function SourceLocation(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { this.source = p.sourceFile; } +}; + + +function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + lineBreakG.lastIndex = cur; + var match = lineBreakG.exec(input); + if (match && match.index < offset) { + ++line; + cur = match.index + match[0].length; + } else { + return new Position(line, offset - cur) + } + } +} + + +var defaultOptions = { + ecmaVersion: 7, + sourceType: "script", + onInsertedSemicolon: null, + onTrailingComma: null, + allowReserved: null, + allowReturnOutsideFunction: false, + allowImportExportEverywhere: false, + allowHashBang: false, + locations: false, + onToken: null, + onComment: null, + ranges: false, + program: null, + sourceFile: null, + directSourceFile: null, + preserveParens: false, + plugins: {} +}; + + +function getOptions(opts) { + var options = {}; + + for (var opt in defaultOptions) + { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; } + + if (options.ecmaVersion >= 2015) + { options.ecmaVersion -= 2009; } + + if (options.allowReserved == null) + { options.allowReserved = options.ecmaVersion < 5; } + + if (isArray(options.onToken)) { + var tokens = options.onToken; + options.onToken = function (token) { return tokens.push(token); }; + } + if (isArray(options.onComment)) + { options.onComment = pushComment(options, options.onComment); } + + return options +} + +function pushComment(options, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start: start, + end: end + }; + if (options.locations) + { comment.loc = new SourceLocation(this, startLoc, endLoc); } + if (options.ranges) + { comment.range = [start, end]; } + array.push(comment); + } +} + +var plugins = {}; + +function keywordRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") +} + +var Parser = function Parser(options, input, startPos) { + this.options = options = getOptions(options); + this.sourceFile = options.sourceFile; + this.keywords = keywordRegexp(keywords[options.ecmaVersion >= 6 ? 6 : 5]); + var reserved = ""; + if (!options.allowReserved) { + for (var v = options.ecmaVersion;; v--) + { if (reserved = reservedWords[v]) { break } } + if (options.sourceType == "module") { reserved += " await"; } + } + this.reservedWords = keywordRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = keywordRegexp(reservedStrict); + this.reservedWordsStrictBind = keywordRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + + this.containsEsc = false; + + this.loadPlugins(options.plugins); + + + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + + this.type = types.eof; + this.value = null; + this.start = this.end = this.pos; + this.startLoc = this.endLoc = this.curPosition(); + + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + + this.context = this.initialContext(); + this.exprAllowed = true; + + this.inModule = options.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + + this.potentialArrowAt = -1; + + this.inFunction = this.inGenerator = this.inAsync = false; + this.yieldPos = this.awaitPos = 0; + this.labels = []; + + if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") + { this.skipLineComment(2); } + + this.scopeStack = []; + this.enterFunctionScope(); +}; + +Parser.prototype.isKeyword = function isKeyword (word) { return this.keywords.test(word) }; +Parser.prototype.isReservedWord = function isReservedWord (word) { return this.reservedWords.test(word) }; + +Parser.prototype.extend = function extend (name, f) { + this[name] = f(this[name]); +}; + +Parser.prototype.loadPlugins = function loadPlugins (pluginConfigs) { + var this$1 = this; + + for (var name in pluginConfigs) { + var plugin = plugins[name]; + if (!plugin) { throw new Error("Plugin '" + name + "' not found") } + plugin(this$1, pluginConfigs[name]); + } +}; + +Parser.prototype.parse = function parse () { + var node = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node) +}; + +var pp = Parser.prototype; + + +var literal = /^(?:'((?:[^']|\.)*)'|"((?:[^"]|\.)*)"|;)/; +pp.strictDirective = function(start) { + var this$1 = this; + + for (;;) { + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this$1.input)[0].length; + var match = literal.exec(this$1.input.slice(start)); + if (!match) { return false } + if ((match[1] || match[2]) == "use strict") { return true } + start += match[0].length; + } +}; + + +pp.eat = function(type) { + if (this.type === type) { + this.next(); + return true + } else { + return false + } +}; + + +pp.isContextual = function(name) { + return this.type === types.name && this.value === name +}; + + +pp.eatContextual = function(name) { + return this.value === name && this.eat(types.name) +}; + + +pp.expectContextual = function(name) { + if (!this.eatContextual(name)) { this.unexpected(); } +}; + + +pp.canInsertSemicolon = function() { + return this.type === types.eof || + this.type === types.braceR || + lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) +}; + +pp.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) + { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } + return true + } +}; + + +pp.semicolon = function() { + if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); } +}; + +pp.afterTrailingComma = function(tokType, notNext) { + if (this.type == tokType) { + if (this.options.onTrailingComma) + { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } + if (!notNext) + { this.next(); } + return true + } +}; + + +pp.expect = function(type) { + this.eat(type) || this.unexpected(); +}; + + +pp.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); +}; + +function DestructuringErrors() { + this.shorthandAssign = + this.trailingComma = + this.parenthesizedAssign = + this.parenthesizedBind = + -1; +} + +pp.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { return } + if (refDestructuringErrors.trailingComma > -1) + { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } +}; + +pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + var pos = refDestructuringErrors ? refDestructuringErrors.shorthandAssign : -1; + if (!andThrow) { return pos >= 0 } + if (pos > -1) { this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns"); } +}; + +pp.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) + { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } + if (this.awaitPos) + { this.raise(this.awaitPos, "Await expression cannot be a default value"); } +}; + +pp.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") + { return this.isSimpleAssignTarget(expr.expression) } + return expr.type === "Identifier" || expr.type === "MemberExpression" +}; + +var pp$1 = Parser.prototype; + + + +pp$1.parseTopLevel = function(node) { + var this$1 = this; + + var exports = {}; + if (!node.body) { node.body = []; } + while (this.type !== types.eof) { + var stmt = this$1.parseStatement(true, true, exports); + node.body.push(stmt); + } + this.next(); + if (this.options.ecmaVersion >= 6) { + node.sourceType = this.options.sourceType; + } + return this.finishNode(node, "Program") +}; + +var loopLabel = {kind: "loop"}; +var switchLabel = {kind: "switch"}; + +pp$1.isLet = function() { + if (this.type !== types.name || this.options.ecmaVersion < 6 || this.value != "let") { return false } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 91 || nextCh == 123) { return true } + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; } + var ident = this.input.slice(next, pos); + if (!this.isKeyword(ident)) { return true } + } + return false +}; + +pp$1.isAsyncFunction = function() { + if (this.type !== types.name || this.options.ecmaVersion < 8 || this.value != "async") + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + return !lineBreak.test(this.input.slice(this.pos, next)) && + this.input.slice(next, next + 8) === "function" && + (next + 8 == this.input.length || !isIdentifierChar(this.input.charAt(next + 8))) +}; + + +pp$1.parseStatement = function(declaration, topLevel, exports) { + var starttype = this.type, node = this.startNode(), kind; + + if (this.isLet()) { + starttype = types._var; + kind = "let"; + } + + + switch (starttype) { + case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword) + case types._debugger: return this.parseDebuggerStatement(node) + case types._do: return this.parseDoStatement(node) + case types._for: return this.parseForStatement(node) + case types._function: + if (!declaration && this.options.ecmaVersion >= 6) { this.unexpected(); } + return this.parseFunctionStatement(node, false) + case types._class: + if (!declaration) { this.unexpected(); } + return this.parseClass(node, true) + case types._if: return this.parseIfStatement(node) + case types._return: return this.parseReturnStatement(node) + case types._switch: return this.parseSwitchStatement(node) + case types._throw: return this.parseThrowStatement(node) + case types._try: return this.parseTryStatement(node) + case types._const: case types._var: + kind = kind || this.value; + if (!declaration && kind != "var") { this.unexpected(); } + return this.parseVarStatement(node, kind) + case types._while: return this.parseWhileStatement(node) + case types._with: return this.parseWithStatement(node) + case types.braceL: return this.parseBlock() + case types.semi: return this.parseEmptyStatement(node) + case types._export: + case types._import: + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) + { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } + if (!this.inModule) + { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } + } + return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports) + + default: + if (this.isAsyncFunction() && declaration) { + this.next(); + return this.parseFunctionStatement(node, true) + } + + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) + { return this.parseLabeledStatement(node, maybeName, expr) } + else { return this.parseExpressionStatement(node, expr) } + } +}; + +pp$1.parseBreakContinueStatement = function(node, keyword) { + var this$1 = this; + + var isBreak = keyword == "break"; + this.next(); + if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; } + else if (this.type !== types.name) { this.unexpected(); } + else { + node.label = this.parseIdent(); + this.semicolon(); + } + + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this$1.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } + if (node.label && isBreak) { break } + } + } + if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") +}; + +pp$1.parseDebuggerStatement = function(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") +}; + +pp$1.parseDoStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.labels.pop(); + this.expect(types._while); + node.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) + { this.eat(types.semi); } + else + { this.semicolon(); } + return this.finishNode(node, "DoWhileStatement") +}; + + +pp$1.parseForStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + this.enterLexicalScope(); + this.expect(types.parenL); + if (this.type === types.semi) { return this.parseFor(node, null) } + var isLet = this.isLet(); + if (this.type === types._var || this.type === types._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1 && + !(kind !== "var" && init$1.declarations[0].init)) + { return this.parseForIn(node, init$1) } + return this.parseFor(node, init$1) + } + var refDestructuringErrors = new DestructuringErrors; + var init = this.parseExpression(true, refDestructuringErrors); + if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + this.toAssignable(init); + this.checkLVal(init); + this.checkPatternErrors(refDestructuringErrors, true); + return this.parseForIn(node, init) + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + return this.parseFor(node, init) +}; + +pp$1.parseFunctionStatement = function(node, isAsync) { + this.next(); + return this.parseFunction(node, true, false, isAsync) +}; + +pp$1.isFunction = function() { + return this.type === types._function || this.isAsyncFunction() +}; + +pp$1.parseIfStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + node.consequent = this.parseStatement(!this.strict && this.isFunction()); + node.alternate = this.eat(types._else) ? this.parseStatement(!this.strict && this.isFunction()) : null; + return this.finishNode(node, "IfStatement") +}; + +pp$1.parseReturnStatement = function(node) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) + { this.raise(this.start, "'return' outside of function"); } + this.next(); + + + if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") +}; + +pp$1.parseSwitchStatement = function(node) { + var this$1 = this; + + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(types.braceL); + this.labels.push(switchLabel); + this.enterLexicalScope(); + + + var cur; + for (var sawDefault = false; this.type != types.braceR;) { + if (this$1.type === types._case || this$1.type === types._default) { + var isCase = this$1.type === types._case; + if (cur) { this$1.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this$1.startNode()); + cur.consequent = []; + this$1.next(); + if (isCase) { + cur.test = this$1.parseExpression(); + } else { + if (sawDefault) { this$1.raiseRecoverable(this$1.lastTokStart, "Multiple default clauses"); } + sawDefault = true; + cur.test = null; + } + this$1.expect(types.colon); + } else { + if (!cur) { this$1.unexpected(); } + cur.consequent.push(this$1.parseStatement(true)); + } + } + this.exitLexicalScope(); + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.next(); + this.labels.pop(); + return this.finishNode(node, "SwitchStatement") +}; + +pp$1.parseThrowStatement = function(node) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) + { this.raise(this.lastTokEnd, "Illegal newline after throw"); } + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") +}; + + +var empty = []; + +pp$1.parseTryStatement = function(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.type === types._catch) { + var clause = this.startNode(); + this.next(); + this.expect(types.parenL); + clause.param = this.parseBindingAtom(); + this.enterLexicalScope(); + this.checkLVal(clause.param, "let"); + this.expect(types.parenR); + clause.body = this.parseBlock(false); + this.exitLexicalScope(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) + { this.raise(node.start, "Missing catch or finally clause"); } + return this.finishNode(node, "TryStatement") +}; + +pp$1.parseVarStatement = function(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") +}; + +pp$1.parseWhileStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node.body = this.parseStatement(false); + this.labels.pop(); + return this.finishNode(node, "WhileStatement") +}; + +pp$1.parseWithStatement = function(node) { + if (this.strict) { this.raise(this.start, "'with' in strict mode"); } + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement(false); + return this.finishNode(node, "WithStatement") +}; + +pp$1.parseEmptyStatement = function(node) { + this.next(); + return this.finishNode(node, "EmptyStatement") +}; + +pp$1.parseLabeledStatement = function(node, maybeName, expr) { + var this$1 = this; + + for (var i$1 = 0, list = this$1.labels; i$1 < list.length; i$1 += 1) + { + var label = list[i$1]; + + if (label.name === maybeName) + { this$1.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } } + var kind = this.type.isLoop ? "loop" : this.type === types._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this$1.labels[i]; + if (label$1.statementStart == node.start) { + label$1.statementStart = this$1.start; + label$1.kind = kind; + } else { break } + } + this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); + node.body = this.parseStatement(true); + if (node.body.type == "ClassDeclaration" || + node.body.type == "VariableDeclaration" && node.body.kind != "var" || + node.body.type == "FunctionDeclaration" && (this.strict || node.body.generator)) + { this.raiseRecoverable(node.body.start, "Invalid labeled declaration"); } + this.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") +}; + +pp$1.parseExpressionStatement = function(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") +}; + + +pp$1.parseBlock = function(createNewLexicalScope) { + var this$1 = this; + if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; + + var node = this.startNode(); + node.body = []; + this.expect(types.braceL); + if (createNewLexicalScope) { + this.enterLexicalScope(); + } + while (!this.eat(types.braceR)) { + var stmt = this$1.parseStatement(true); + node.body.push(stmt); + } + if (createNewLexicalScope) { + this.exitLexicalScope(); + } + return this.finishNode(node, "BlockStatement") +}; + + +pp$1.parseFor = function(node, init) { + node.init = init; + this.expect(types.semi); + node.test = this.type === types.semi ? null : this.parseExpression(); + this.expect(types.semi); + node.update = this.type === types.parenR ? null : this.parseExpression(); + this.expect(types.parenR); + this.exitLexicalScope(); + node.body = this.parseStatement(false); + this.labels.pop(); + return this.finishNode(node, "ForStatement") +}; + + +pp$1.parseForIn = function(node, init) { + var type = this.type === types._in ? "ForInStatement" : "ForOfStatement"; + this.next(); + node.left = init; + node.right = this.parseExpression(); + this.expect(types.parenR); + this.exitLexicalScope(); + node.body = this.parseStatement(false); + this.labels.pop(); + return this.finishNode(node, type) +}; + + +pp$1.parseVar = function(node, isFor, kind) { + var this$1 = this; + + node.declarations = []; + node.kind = kind; + for (;;) { + var decl = this$1.startNode(); + this$1.parseVarId(decl, kind); + if (this$1.eat(types.eq)) { + decl.init = this$1.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this$1.type === types._in || (this$1.options.ecmaVersion >= 6 && this$1.isContextual("of")))) { + this$1.unexpected(); + } else if (decl.id.type != "Identifier" && !(isFor && (this$1.type === types._in || this$1.isContextual("of")))) { + this$1.raise(this$1.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this$1.finishNode(decl, "VariableDeclarator")); + if (!this$1.eat(types.comma)) { break } + } + return node +}; + +pp$1.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(kind); + this.checkLVal(decl.id, kind, false); +}; + + +pp$1.parseFunction = function(node, isStatement, allowExpressionBody, isAsync) { + this.initFunction(node); + if (this.options.ecmaVersion >= 6 && !isAsync) + { node.generator = this.eat(types.star); } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + if (isStatement) { + node.id = isStatement === "nullableID" && this.type != types.name ? null : this.parseIdent(); + if (node.id) { + this.checkLVal(node.id, "var"); + } + } + + var oldInGen = this.inGenerator, oldInAsync = this.inAsync, + oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction; + this.inGenerator = node.generator; + this.inAsync = node.async; + this.yieldPos = 0; + this.awaitPos = 0; + this.inFunction = true; + this.enterFunctionScope(); + + if (!isStatement) + { node.id = this.type == types.name ? this.parseIdent() : null; } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody); + + this.inGenerator = oldInGen; + this.inAsync = oldInAsync; + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.inFunction = oldInFunc; + return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression") +}; + +pp$1.parseFunctionParams = function(node) { + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); +}; + + +pp$1.parseClass = function(node, isStatement) { + var this$1 = this; + + this.next(); + + this.parseClassId(node, isStatement); + this.parseClassSuper(node); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (this$1.eat(types.semi)) { continue } + var method = this$1.startNode(); + var isGenerator = this$1.eat(types.star); + var isAsync = false; + var isMaybeStatic = this$1.type === types.name && this$1.value === "static"; + this$1.parsePropertyName(method); + method.static = isMaybeStatic && this$1.type !== types.parenL; + if (method.static) { + if (isGenerator) { this$1.unexpected(); } + isGenerator = this$1.eat(types.star); + this$1.parsePropertyName(method); + } + if (this$1.options.ecmaVersion >= 8 && !isGenerator && !method.computed && + method.key.type === "Identifier" && method.key.name === "async" && this$1.type !== types.parenL && + !this$1.canInsertSemicolon()) { + isAsync = true; + this$1.parsePropertyName(method); + } + method.kind = "method"; + var isGetSet = false; + if (!method.computed) { + var key = method.key; + if (!isGenerator && !isAsync && key.type === "Identifier" && this$1.type !== types.parenL && (key.name === "get" || key.name === "set")) { + isGetSet = true; + method.kind = key.name; + key = this$1.parsePropertyName(method); + } + if (!method.static && (key.type === "Identifier" && key.name === "constructor" || + key.type === "Literal" && key.value === "constructor")) { + if (hadConstructor) { this$1.raise(key.start, "Duplicate constructor in the same class"); } + if (isGetSet) { this$1.raise(key.start, "Constructor can't have get/set modifier"); } + if (isGenerator) { this$1.raise(key.start, "Constructor can't be a generator"); } + if (isAsync) { this$1.raise(key.start, "Constructor can't be an async method"); } + method.kind = "constructor"; + hadConstructor = true; + } + } + this$1.parseClassMethod(classBody, method, isGenerator, isAsync); + if (isGetSet) { + var paramCount = method.kind === "get" ? 0 : 1; + if (method.value.params.length !== paramCount) { + var start = method.value.start; + if (method.kind === "get") + { this$1.raiseRecoverable(start, "getter should have no params"); } + else + { this$1.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (method.kind === "set" && method.value.params[0].type === "RestElement") + { this$1.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params"); } + } + } + } + node.body = this.finishNode(classBody, "ClassBody"); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") +}; + +pp$1.parseClassMethod = function(classBody, method, isGenerator, isAsync) { + method.value = this.parseMethod(isGenerator, isAsync); + classBody.body.push(this.finishNode(method, "MethodDefinition")); +}; + +pp$1.parseClassId = function(node, isStatement) { + node.id = this.type === types.name ? this.parseIdent() : isStatement === true ? this.unexpected() : null; +}; + +pp$1.parseClassSuper = function(node) { + node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; +}; + + +pp$1.parseExport = function(node, exports) { + var this$1 = this; + + this.next(); + if (this.eat(types.star)) { + this.expectContextual("from"); + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + this.semicolon(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(types._default)) { + this.checkExport(exports, "default", this.lastTokStart); + var isAsync; + if (this.type === types._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, "nullableID", false, isAsync); + } else if (this.type === types._class) { + var cNode = this.startNode(); + node.declaration = this.parseClass(cNode, "nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + if (this.shouldParseExportStatement()) { + node.declaration = this.parseStatement(true); + if (node.declaration.type === "VariableDeclaration") + { this.checkVariableExport(exports, node.declaration.declarations); } + else + { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); } + node.specifiers = []; + node.source = null; + } else { + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + } else { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) { + var spec = list[i]; + + this$1.checkUnreserved(spec.local); + } + + node.source = null; + } + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") +}; + +pp$1.checkExport = function(exports, name, pos) { + if (!exports) { return } + if (has(exports, name)) + { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } + exports[name] = true; +}; + +pp$1.checkPatternExport = function(exports, pat) { + var this$1 = this; + + var type = pat.type; + if (type == "Identifier") + { this.checkExport(exports, pat.name, pat.start); } + else if (type == "ObjectPattern") + { for (var i = 0, list = pat.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this$1.checkPatternExport(exports, prop.value); + } } + else if (type == "ArrayPattern") + { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + + if (elt) { this$1.checkPatternExport(exports, elt); } + } } + else if (type == "AssignmentPattern") + { this.checkPatternExport(exports, pat.left); } + else if (type == "ParenthesizedExpression") + { this.checkPatternExport(exports, pat.expression); } +}; + +pp$1.checkVariableExport = function(exports, decls) { + var this$1 = this; + + if (!exports) { return } + for (var i = 0, list = decls; i < list.length; i += 1) + { + var decl = list[i]; + + this$1.checkPatternExport(exports, decl.id); + } +}; + +pp$1.shouldParseExportStatement = function() { + return this.type.keyword === "var" || + this.type.keyword === "const" || + this.type.keyword === "class" || + this.type.keyword === "function" || + this.isLet() || + this.isAsyncFunction() +}; + + +pp$1.parseExportSpecifiers = function(exports) { + var this$1 = this; + + var nodes = [], first = true; + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node = this$1.startNode(); + node.local = this$1.parseIdent(true); + node.exported = this$1.eatContextual("as") ? this$1.parseIdent(true) : node.local; + this$1.checkExport(exports, node.exported.name, node.exported.start); + nodes.push(this$1.finishNode(node, "ExportSpecifier")); + } + return nodes +}; + + +pp$1.parseImport = function(node) { + this.next(); + if (this.type === types.string) { + node.specifiers = empty; + node.source = this.parseExprAtom(); + } else { + node.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") +}; + + +pp$1.parseImportSpecifiers = function() { + var this$1 = this; + + var nodes = [], first = true; + if (this.type === types.name) { + var node = this.startNode(); + node.local = this.parseIdent(); + this.checkLVal(node.local, "let"); + nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); + if (!this.eat(types.comma)) { return nodes } + } + if (this.type === types.star) { + var node$1 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$1.local = this.parseIdent(); + this.checkLVal(node$1.local, "let"); + nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); + return nodes + } + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node$2 = this$1.startNode(); + node$2.imported = this$1.parseIdent(true); + if (this$1.eatContextual("as")) { + node$2.local = this$1.parseIdent(); + } else { + this$1.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this$1.checkLVal(node$2.local, "let"); + nodes.push(this$1.finishNode(node$2, "ImportSpecifier")); + } + return nodes +}; + +var pp$2 = Parser.prototype; + + +pp$2.toAssignable = function(node, isBinding) { + var this$1 = this; + + if (this.options.ecmaVersion >= 6 && node) { + switch (node.type) { + case "Identifier": + if (this.inAsync && node.name === "await") + { this.raise(node.start, "Can not use 'await' as identifier inside an async function"); } + break + + case "ObjectPattern": + case "ArrayPattern": + break + + case "ObjectExpression": + node.type = "ObjectPattern"; + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + if (prop.kind !== "init") { this$1.raise(prop.key.start, "Object pattern can't contain getter or setter"); } + this$1.toAssignable(prop.value, isBinding); + } + break + + case "ArrayExpression": + node.type = "ArrayPattern"; + this.toAssignableList(node.elements, isBinding); + break + + case "AssignmentExpression": + if (node.operator === "=") { + node.type = "AssignmentPattern"; + delete node.operator; + this.toAssignable(node.left, isBinding); + } else { + this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); + break + } + + case "AssignmentPattern": + break + + case "ParenthesizedExpression": + this.toAssignable(node.expression, isBinding); + break + + case "MemberExpression": + if (!isBinding) { break } + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } + return node +}; + + +pp$2.toAssignableList = function(exprList, isBinding) { + var this$1 = this; + + var end = exprList.length; + if (end) { + var last = exprList[end - 1]; + if (last && last.type == "RestElement") { + --end; + } else if (last && last.type == "SpreadElement") { + last.type = "RestElement"; + var arg = last.argument; + this.toAssignable(arg, isBinding); + --end; + } + + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") + { this.unexpected(last.argument.start); } + } + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { this$1.toAssignable(elt, isBinding); } + } + return exprList +}; + + +pp$2.parseSpread = function(refDestructuringErrors) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node, "SpreadElement") +}; + +pp$2.parseRestBinding = function() { + var node = this.startNode(); + this.next(); + + if (this.options.ecmaVersion === 6 && this.type !== types.name) + { this.unexpected(); } + + node.argument = this.parseBindingAtom(); + + return this.finishNode(node, "RestElement") +}; + + +pp$2.parseBindingAtom = function() { + if (this.options.ecmaVersion < 6) { return this.parseIdent() } + switch (this.type) { + case types.name: + return this.parseIdent() + + case types.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types.bracketR, true, true); + return this.finishNode(node, "ArrayPattern") + + case types.braceL: + return this.parseObj(true) + + default: + this.unexpected(); + } +}; + +pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) { + var this$1 = this; + + var elts = [], first = true; + while (!this.eat(close)) { + if (first) { first = false; } + else { this$1.expect(types.comma); } + if (allowEmpty && this$1.type === types.comma) { + elts.push(null); + } else if (allowTrailingComma && this$1.afterTrailingComma(close)) { + break + } else if (this$1.type === types.ellipsis) { + var rest = this$1.parseRestBinding(); + this$1.parseBindingListItem(rest); + elts.push(rest); + if (this$1.type === types.comma) { this$1.raise(this$1.start, "Comma is not permitted after the rest element"); } + this$1.expect(close); + break + } else { + var elem = this$1.parseMaybeDefault(this$1.start, this$1.startLoc); + this$1.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts +}; + +pp$2.parseBindingListItem = function(param) { + return param +}; + + +pp$2.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern") +}; + + +pp$2.checkLVal = function(expr, bindingType, checkClashes) { + var this$1 = this; + + switch (expr.type) { + case "Identifier": + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) + { this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } + if (checkClashes) { + if (has(checkClashes, expr.name)) + { this.raiseRecoverable(expr.start, "Argument name clash"); } + checkClashes[expr.name] = true; + } + if (bindingType && bindingType !== "none") { + if ( + bindingType === "var" && !this.canDeclareVarName(expr.name) || + bindingType !== "var" && !this.canDeclareLexicalName(expr.name) + ) { + this.raiseRecoverable(expr.start, ("Identifier '" + (expr.name) + "' has already been declared")); + } + if (bindingType === "var") { + this.declareVarName(expr.name); + } else { + this.declareLexicalName(expr.name); + } + } + break + + case "MemberExpression": + if (bindingType) { this.raiseRecoverable(expr.start, (bindingType ? "Binding" : "Assigning to") + " member expression"); } + break + + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this$1.checkLVal(prop.value, bindingType, checkClashes); + } + break + + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + + if (elem) { this$1.checkLVal(elem, bindingType, checkClashes); } + } + break + + case "AssignmentPattern": + this.checkLVal(expr.left, bindingType, checkClashes); + break + + case "RestElement": + this.checkLVal(expr.argument, bindingType, checkClashes); + break + + case "ParenthesizedExpression": + this.checkLVal(expr.expression, bindingType, checkClashes); + break + + default: + this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue"); + } +}; + + +var pp$3 = Parser.prototype; + + +pp$3.checkPropClash = function(prop, propHash) { + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) + { return } + var key = prop.key; + var name; + switch (key.type) { + case "Identifier": name = key.name; break + case "Literal": name = String(key.value); break + default: return + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); } + propHash.proto = true; + } + return + } + name = "$" + name; + var other = propHash[name]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) + { this.raiseRecoverable(key.start, "Redefinition of property"); } + } else { + other = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; +}; + + + + +pp$3.parseExpression = function(noIn, refDestructuringErrors) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(noIn, refDestructuringErrors); + if (this.type === types.comma) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(types.comma)) { node.expressions.push(this$1.parseMaybeAssign(noIn, refDestructuringErrors)); } + return this.finishNode(node, "SequenceExpression") + } + return expr +}; + + +pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { + if (this.inGenerator && this.isContextual("yield")) { return this.parseYield() } + + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; + } else { + refDestructuringErrors = new DestructuringErrors; + ownDestructuringErrors = true; + } + + var startPos = this.start, startLoc = this.startLoc; + if (this.type == types.parenL || this.type == types.name) + { this.potentialArrowAt = this.start; } + var left = this.parseMaybeConditional(noIn, refDestructuringErrors); + if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } + if (this.type.isAssign) { + this.checkPatternErrors(refDestructuringErrors, true); + if (!ownDestructuringErrors) { DestructuringErrors.call(refDestructuringErrors); } + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.value; + node.left = this.type === types.eq ? this.toAssignable(left) : left; + refDestructuringErrors.shorthandAssign = -1; + this.checkLVal(left); + this.next(); + node.right = this.parseMaybeAssign(noIn); + return this.finishNode(node, "AssignmentExpression") + } else { + if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } + } + if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } + if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } + return left +}; + + +pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(noIn, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + if (this.eat(types.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(types.colon); + node.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(node, "ConditionalExpression") + } + return expr +}; + + +pp$3.parseExprOps = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + return expr.start == startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn) +}; + + +pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.type.binop; + if (prec != null && (!noIn || this.type !== types._in)) { + if (prec > minPrec) { + var logical = this.type === types.logicalOR || this.type === types.logicalAND; + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); + var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical); + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) + } + } + return left +}; + +pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.operator = op; + node.right = right; + return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") +}; + + +pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.inAsync && this.isContextual("await")) { + expr = this.parseAwait(refDestructuringErrors); + sawUnary = true; + } else if (this.type.prefix) { + var node = this.startNode(), update = this.type === types.incDec; + node.operator = this.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(null, true); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { this.checkLVal(node.argument); } + else if (this.strict && node.operator === "delete" && + node.argument.type === "Identifier") + { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } + else { sawUnary = true; } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else { + expr = this.parseExprSubscripts(refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$1 = this$1.startNodeAt(startPos, startLoc); + node$1.operator = this$1.value; + node$1.prefix = false; + node$1.argument = expr; + this$1.checkLVal(expr); + this$1.next(); + expr = this$1.finishNode(node$1, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(types.starstar)) + { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) } + else + { return expr } +}; + + +pp$3.parseExprSubscripts = function(refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors); + var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")"; + if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) { return expr } + var result = this.parseSubscripts(expr, startPos, startLoc); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } + if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } + } + return result +}; + +pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { + var this$1 = this; + + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && + this.lastTokEnd == base.end && !this.canInsertSemicolon(); + for (var computed = (void 0);;) { + if ((computed = this$1.eat(types.bracketL)) || this$1.eat(types.dot)) { + var node = this$1.startNodeAt(startPos, startLoc); + node.object = base; + node.property = computed ? this$1.parseExpression() : this$1.parseIdent(true); + node.computed = !!computed; + if (computed) { this$1.expect(types.bracketR); } + base = this$1.finishNode(node, "MemberExpression"); + } else if (!noCalls && this$1.eat(types.parenL)) { + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this$1.yieldPos, oldAwaitPos = this$1.awaitPos; + this$1.yieldPos = 0; + this$1.awaitPos = 0; + var exprList = this$1.parseExprList(types.parenR, this$1.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !this$1.canInsertSemicolon() && this$1.eat(types.arrow)) { + this$1.checkPatternErrors(refDestructuringErrors, false); + this$1.checkYieldAwaitInDefaultParams(); + this$1.yieldPos = oldYieldPos; + this$1.awaitPos = oldAwaitPos; + return this$1.parseArrowExpression(this$1.startNodeAt(startPos, startLoc), exprList, true) + } + this$1.checkExpressionErrors(refDestructuringErrors, true); + this$1.yieldPos = oldYieldPos || this$1.yieldPos; + this$1.awaitPos = oldAwaitPos || this$1.awaitPos; + var node$1 = this$1.startNodeAt(startPos, startLoc); + node$1.callee = base; + node$1.arguments = exprList; + base = this$1.finishNode(node$1, "CallExpression"); + } else if (this$1.type === types.backQuote) { + var node$2 = this$1.startNodeAt(startPos, startLoc); + node$2.tag = base; + node$2.quasi = this$1.parseTemplate({isTagged: true}); + base = this$1.finishNode(node$2, "TaggedTemplateExpression"); + } else { + return base + } + } +}; + + +pp$3.parseExprAtom = function(refDestructuringErrors) { + var node, canBeArrow = this.potentialArrowAt == this.start; + switch (this.type) { + case types._super: + if (!this.inFunction) + { this.raise(this.start, "'super' outside of function or class"); } + + case types._this: + var type = this.type === types._this ? "ThisExpression" : "Super"; + node = this.startNode(); + this.next(); + return this.finishNode(node, type) + + case types.name: + var startPos = this.start, startLoc = this.startLoc; + var id = this.parseIdent(this.type !== types.name); + if (this.options.ecmaVersion >= 8 && id.name === "async" && !this.canInsertSemicolon() && this.eat(types._function)) + { return this.parseFunction(this.startNodeAt(startPos, startLoc), false, false, true) } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types.arrow)) + { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types.name) { + id = this.parseIdent(); + if (this.canInsertSemicolon() || !this.eat(types.arrow)) + { this.unexpected(); } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true) + } + } + return id + + case types.regexp: + var value = this.value; + node = this.parseLiteral(value.value); + node.regex = {pattern: value.pattern, flags: value.flags}; + return node + + case types.num: case types.string: + return this.parseLiteral(this.value) + + case types._null: case types._true: case types._false: + node = this.startNode(); + node.value = this.type === types._null ? null : this.type === types._true; + node.raw = this.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case types.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) + { refDestructuringErrors.parenthesizedAssign = start; } + if (refDestructuringErrors.parenthesizedBind < 0) + { refDestructuringErrors.parenthesizedBind = start; } + } + return expr + + case types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node, "ArrayExpression") + + case types.braceL: + return this.parseObj(false, refDestructuringErrors) + + case types._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, false) + + case types._class: + return this.parseClass(this.startNode(), false) + + case types._new: + return this.parseNew() + + case types.backQuote: + return this.parseTemplate() + + default: + this.unexpected(); + } +}; + +pp$3.parseLiteral = function(value) { + var node = this.startNode(); + node.value = value; + node.raw = this.input.slice(this.start, this.end); + this.next(); + return this.finishNode(node, "Literal") +}; + +pp$3.parseParenExpression = function() { + this.expect(types.parenL); + var val = this.parseExpression(); + this.expect(types.parenR); + return val +}; + +pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { + var this$1 = this; + + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart, innerParenStart; + this.yieldPos = 0; + this.awaitPos = 0; + while (this.type !== types.parenR) { + first ? first = false : this$1.expect(types.comma); + if (allowTrailingComma && this$1.afterTrailingComma(types.parenR, true)) { + lastIsComma = true; + break + } else if (this$1.type === types.ellipsis) { + spreadStart = this$1.start; + exprList.push(this$1.parseParenItem(this$1.parseRestBinding())); + if (this$1.type === types.comma) { this$1.raise(this$1.start, "Comma is not permitted after the rest element"); } + break + } else { + if (this$1.type === types.parenL && !innerParenStart) { + innerParenStart = this$1.start; + } + exprList.push(this$1.parseMaybeAssign(false, refDestructuringErrors, this$1.parseParenItem)); + } + } + var innerEndPos = this.start, innerEndLoc = this.startLoc; + this.expect(types.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (innerParenStart) { this.unexpected(innerParenStart); } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList) + } + + if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } + if (spreadStart) { this.unexpected(spreadStart); } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression") + } else { + return val + } +}; + +pp$3.parseParenItem = function(item) { + return item +}; + +pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) +}; + + +var empty$1 = []; + +pp$3.parseNew = function() { + var node = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) { + node.meta = meta; + node.property = this.parseIdent(true); + if (node.property.name !== "target") + { this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target"); } + if (!this.inFunction) + { this.raiseRecoverable(node.start, "new.target can only be used in functions"); } + return this.finishNode(node, "MetaProperty") + } + var startPos = this.start, startLoc = this.startLoc; + node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); + if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false); } + else { node.arguments = empty$1; } + return this.finishNode(node, "NewExpression") +}; + + +pp$3.parseTemplateElement = function(ref) { + var isTagged = ref.isTagged; + + var elem = this.startNode(); + if (this.type === types.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types.backQuote; + return this.finishNode(elem, "TemplateElement") +}; + +pp$3.parseTemplate = function(ref) { + var this$1 = this; + if ( ref === void 0 ) ref = {}; + var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; + + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement({isTagged: isTagged}); + node.quasis = [curElt]; + while (!curElt.tail) { + this$1.expect(types.dollarBraceL); + node.expressions.push(this$1.parseExpression()); + this$1.expect(types.braceR); + node.quasis.push(curElt = this$1.parseTemplateElement({isTagged: isTagged})); + } + this.next(); + return this.finishNode(node, "TemplateLiteral") +}; + + +pp$3.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && + (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL) && + !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) +}; + +pp$3.parseObj = function(isPattern, refDestructuringErrors) { + var this$1 = this; + + var node = this.startNode(), first = true, propHash = {}; + node.properties = []; + this.next(); + while (!this.eat(types.braceR)) { + if (!first) { + this$1.expect(types.comma); + if (this$1.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var prop = this$1.startNode(), isGenerator = (void 0), isAsync = (void 0), startPos = (void 0), startLoc = (void 0); + if (this$1.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this$1.start; + startLoc = this$1.startLoc; + } + if (!isPattern) + { isGenerator = this$1.eat(types.star); } + } + this$1.parsePropertyName(prop); + if (!isPattern && this$1.options.ecmaVersion >= 8 && !isGenerator && this$1.isAsyncProp(prop)) { + isAsync = true; + this$1.parsePropertyName(prop, refDestructuringErrors); + } else { + isAsync = false; + } + this$1.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors); + this$1.checkPropClash(prop, propHash); + node.properties.push(this$1.finishNode(prop, "Property")); + } + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") +}; + +pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors) { + if ((isGenerator || isAsync) && this.type === types.colon) + { this.unexpected(); } + + if (this.eat(types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) { + if (isPattern) { this.unexpected(); } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set") && + (this.type != types.comma && this.type != types.braceR)) { + if (isGenerator || isAsync || isPattern) { this.unexpected(); } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") + { this.raiseRecoverable(start, "getter should have no params"); } + else + { this.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") + { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + this.checkUnreserved(prop.key); + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else if (this.type === types.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) + { refDestructuringErrors.shorthandAssign = this.start; } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else { + prop.value = prop.key; + } + prop.shorthand = true; + } else { this.unexpected(); } +}; + +pp$3.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types.bracketR); + return prop.key + } else { + prop.computed = false; + } + } + return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(true) +}; + + +pp$3.initFunction = function(node) { + node.id = null; + if (this.options.ecmaVersion >= 6) { + node.generator = false; + node.expression = false; + } + if (this.options.ecmaVersion >= 8) + { node.async = false; } +}; + + +pp$3.parseMethod = function(isGenerator, isAsync) { + var node = this.startNode(), oldInGen = this.inGenerator, oldInAsync = this.inAsync, + oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction; + + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.inGenerator = node.generator; + this.inAsync = node.async; + this.yieldPos = 0; + this.awaitPos = 0; + this.inFunction = true; + this.enterFunctionScope(); + + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node, false); + + this.inGenerator = oldInGen; + this.inAsync = oldInAsync; + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.inFunction = oldInFunc; + return this.finishNode(node, "FunctionExpression") +}; + + +pp$3.parseArrowExpression = function(node, params, isAsync) { + var oldInGen = this.inGenerator, oldInAsync = this.inAsync, + oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldInFunc = this.inFunction; + + this.enterFunctionScope(); + this.initFunction(node); + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.inGenerator = false; + this.inAsync = node.async; + this.yieldPos = 0; + this.awaitPos = 0; + this.inFunction = true; + + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true); + + this.inGenerator = oldInGen; + this.inAsync = oldInAsync; + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.inFunction = oldInFunc; + return this.finishNode(node, "ArrowFunctionExpression") +}; + + +pp$3.parseFunctionBody = function(node, isArrowFunction) { + var isExpression = isArrowFunction && this.type !== types.braceL; + var oldStrict = this.strict, useStrict = false; + + if (isExpression) { + node.body = this.parseMaybeAssign(); + node.expression = true; + this.checkParams(node, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + if (useStrict && nonSimple) + { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } + } + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { this.strict = true; } + + this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && this.isSimpleParamList(node.params)); + node.body = this.parseBlock(false); + node.expression = false; + this.labels = oldLabels; + } + this.exitFunctionScope(); + + if (this.strict && node.id) { + this.checkLVal(node.id, "none"); + } + this.strict = oldStrict; +}; + +pp$3.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) + { + var param = list[i]; + + if (param.type !== "Identifier") { return false + } } + return true +}; + + +pp$3.checkParams = function(node, allowDuplicates) { + var this$1 = this; + + var nameHash = {}; + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + this$1.checkLVal(param, "var", allowDuplicates ? null : nameHash); + } +}; + + +pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var this$1 = this; + + var elts = [], first = true; + while (!this.eat(close)) { + if (!first) { + this$1.expect(types.comma); + if (allowTrailingComma && this$1.afterTrailingComma(close)) { break } + } else { first = false; } + + var elt = (void 0); + if (allowEmpty && this$1.type === types.comma) + { elt = null; } + else if (this$1.type === types.ellipsis) { + elt = this$1.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this$1.type === types.comma && refDestructuringErrors.trailingComma < 0) + { refDestructuringErrors.trailingComma = this$1.start; } + } else { + elt = this$1.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts +}; + + +pp$3.checkUnreserved = function(ref) { + var start = ref.start; + var end = ref.end; + var name = ref.name; + + if (this.inGenerator && name === "yield") + { this.raiseRecoverable(start, "Can not use 'yield' as identifier inside a generator"); } + if (this.inAsync && name === "await") + { this.raiseRecoverable(start, "Can not use 'await' as identifier inside an async function"); } + if (this.isKeyword(name)) + { this.raise(start, ("Unexpected keyword '" + name + "'")); } + if (this.options.ecmaVersion < 6 && + this.input.slice(start, end).indexOf("\\") != -1) { return } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name)) + { this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); } +}; + +pp$3.parseIdent = function(liberal, isBinding) { + var node = this.startNode(); + if (liberal && this.options.allowReserved == "never") { liberal = false; } + if (this.type === types.name) { + node.name = this.value; + } else if (this.type.keyword) { + node.name = this.type.keyword; + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node, "Identifier"); + if (!liberal) { this.checkUnreserved(node); } + return node +}; + + +pp$3.parseYield = function() { + if (!this.yieldPos) { this.yieldPos = this.start; } + + var node = this.startNode(); + this.next(); + if (this.type == types.semi || this.canInsertSemicolon() || (this.type != types.star && !this.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types.star); + node.argument = this.parseMaybeAssign(); + } + return this.finishNode(node, "YieldExpression") +}; + +pp$3.parseAwait = function() { + if (!this.awaitPos) { this.awaitPos = this.start; } + + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(null, true); + return this.finishNode(node, "AwaitExpression") +}; + +var pp$4 = Parser.prototype; + + +pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; err.loc = loc; err.raisedAt = this.pos; + throw err +}; + +pp$4.raiseRecoverable = pp$4.raise; + +pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart) + } +}; + +var pp$5 = Parser.prototype; + +var assign = Object.assign || function(target) { + var sources = [], len = arguments.length - 1; + while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; + + for (var i = 0, list = sources; i < list.length; i += 1) { + var source = list[i]; + + for (var key in source) { + if (has(source, key)) { + target[key] = source[key]; + } + } + } + return target +}; + + +pp$5.enterFunctionScope = function() { + this.scopeStack.push({var: {}, lexical: {}, childVar: {}, parentLexical: {}}); +}; + +pp$5.exitFunctionScope = function() { + this.scopeStack.pop(); +}; + +pp$5.enterLexicalScope = function() { + var parentScope = this.scopeStack[this.scopeStack.length - 1]; + var childScope = {var: {}, lexical: {}, childVar: {}, parentLexical: {}}; + + this.scopeStack.push(childScope); + assign(childScope.parentLexical, parentScope.lexical, parentScope.parentLexical); +}; + +pp$5.exitLexicalScope = function() { + var childScope = this.scopeStack.pop(); + var parentScope = this.scopeStack[this.scopeStack.length - 1]; + + assign(parentScope.childVar, childScope.var, childScope.childVar); +}; + +pp$5.canDeclareVarName = function(name) { + var currentScope = this.scopeStack[this.scopeStack.length - 1]; + + return !has(currentScope.lexical, name) && !has(currentScope.parentLexical, name) +}; + +pp$5.canDeclareLexicalName = function(name) { + var currentScope = this.scopeStack[this.scopeStack.length - 1]; + + return !has(currentScope.lexical, name) && !has(currentScope.var, name) && !has(currentScope.childVar, name) +}; + +pp$5.declareVarName = function(name) { + this.scopeStack[this.scopeStack.length - 1].var[name] = true; +}; + +pp$5.declareLexicalName = function(name) { + this.scopeStack[this.scopeStack.length - 1].lexical[name] = true; +}; + +var Node = function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) + { this.loc = new SourceLocation(parser, loc); } + if (parser.options.directSourceFile) + { this.sourceFile = parser.options.directSourceFile; } + if (parser.options.ranges) + { this.range = [pos, 0]; } +}; + + +var pp$6 = Parser.prototype; + +pp$6.startNode = function() { + return new Node(this, this.start, this.startLoc) +}; + +pp$6.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc) +}; + + +function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + if (this.options.locations) + { node.loc.end = loc; } + if (this.options.ranges) + { node.range[1] = pos; } + return node +} + +pp$6.finishNode = function(node, type) { + return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) +}; + + +pp$6.finishNodeAt = function(node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc) +}; + + +var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; +}; + +var types$1 = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) +}; + +var pp$7 = Parser.prototype; + +pp$7.initialContext = function() { + return [types$1.b_stat] +}; + +pp$7.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types$1.f_expr || parent === types$1.f_stat) + { return true } + if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr)) + { return !parent.isExpr } + + if (prevType === types._return || prevType == types.name && this.exprAllowed) + { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } + if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType == types.arrow) + { return true } + if (prevType == types.braceL) + { return parent === types$1.b_stat } + if (prevType == types._var || prevType == types.name) + { return false } + return !this.exprAllowed +}; + +pp$7.inGeneratorContext = function() { + var this$1 = this; + + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this$1.context[i]; + if (context.token === "function") + { return context.generator } + } + return false +}; + +pp$7.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType == types.dot) + { this.exprAllowed = false; } + else if (update = type.updateContext) + { update.call(this, prevType); } + else + { this.exprAllowed = type.beforeExpr; } +}; + + +types.parenR.updateContext = types.braceR.updateContext = function() { + if (this.context.length == 1) { + this.exprAllowed = true; + return + } + var out = this.context.pop(); + if (out === types$1.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; +}; + +types.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr); + this.exprAllowed = true; +}; + +types.dollarBraceL.updateContext = function() { + this.context.push(types$1.b_tmpl); + this.exprAllowed = true; +}; + +types.parenL.updateContext = function(prevType) { + var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; + this.context.push(statementParens ? types$1.p_stat : types$1.p_expr); + this.exprAllowed = true; +}; + +types.incDec.updateContext = function() { +}; + +types._function.updateContext = types._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && + !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) + { this.context.push(types$1.f_expr); } + else + { this.context.push(types$1.f_stat); } + this.exprAllowed = false; +}; + +types.backQuote.updateContext = function() { + if (this.curContext() === types$1.q_tmpl) + { this.context.pop(); } + else + { this.context.push(types$1.q_tmpl); } + this.exprAllowed = false; +}; + +types.star.updateContext = function(prevType) { + if (prevType == types._function) { + var index = this.context.length - 1; + if (this.context[index] === types$1.f_expr) + { this.context[index] = types$1.f_expr_gen; } + else + { this.context[index] = types$1.f_gen; } + } + this.exprAllowed = true; +}; + +types.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6) { + if (this.value == "of" && !this.exprAllowed || + this.value == "yield" && this.inGeneratorContext()) + { allowed = true; } + } + this.exprAllowed = allowed; +}; + + +var Token = function Token(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) + { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } + if (p.options.ranges) + { this.range = [p.start, p.end]; } +}; + + +var pp$8 = Parser.prototype; + +var isRhino = typeof Packages == "object" && Object.prototype.toString.call(Packages) == "[object JavaPackage]"; + + +pp$8.next = function() { + if (this.options.onToken) + { this.options.onToken(new Token(this)); } + + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); +}; + +pp$8.getToken = function() { + this.next(); + return new Token(this) +}; + +if (typeof Symbol !== "undefined") + { pp$8[Symbol.iterator] = function() { + var this$1 = this; + + return { + next: function () { + var token = this$1.getToken(); + return { + done: token.type === types.eof, + value: token + } + } + } + }; } + + +pp$8.curContext = function() { + return this.context[this.context.length - 1] +}; + + +pp$8.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } + + this.start = this.pos; + if (this.options.locations) { this.startLoc = this.curPosition(); } + if (this.pos >= this.input.length) { return this.finishToken(types.eof) } + + if (curContext.override) { return curContext.override(this) } + else { this.readToken(this.fullCharCodeAtPos()); } +}; + +pp$8.readToken = function(code) { + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 ) + { return this.readWord() } + + return this.getTokenFromCode(code) +}; + +pp$8.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 0xd7ff || code >= 0xe000) { return code } + var next = this.input.charCodeAt(this.pos + 1); + return (code << 10) + next - 0x35fdc00 +}; + +pp$8.skipBlockComment = function() { + var this$1 = this; + + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } + this.pos = end + 2; + if (this.options.locations) { + lineBreakG.lastIndex = start; + var match; + while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { + ++this$1.curLine; + this$1.lineStart = match.index + match[0].length; + } + } + if (this.options.onComment) + { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, + startLoc, this.curPosition()); } +}; + +pp$8.skipLineComment = function(startSkip) { + var this$1 = this; + + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this$1.input.charCodeAt(++this$1.pos); + } + if (this.options.onComment) + { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, + startLoc, this.curPosition()); } +}; + + +pp$8.skipSpace = function() { + var this$1 = this; + + loop: while (this.pos < this.input.length) { + var ch = this$1.input.charCodeAt(this$1.pos); + switch (ch) { + case 32: case 160: + ++this$1.pos; + break + case 13: + if (this$1.input.charCodeAt(this$1.pos + 1) === 10) { + ++this$1.pos; + } + case 10: case 8232: case 8233: + ++this$1.pos; + if (this$1.options.locations) { + ++this$1.curLine; + this$1.lineStart = this$1.pos; + } + break + case 47: + switch (this$1.input.charCodeAt(this$1.pos + 1)) { + case 42: + this$1.skipBlockComment(); + break + case 47: + this$1.skipLineComment(2); + break + default: + break loop + } + break + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this$1.pos; + } else { + break loop + } + } + } +}; + + +pp$8.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { this.endLoc = this.curPosition(); } + var prevType = this.type; + this.type = type; + this.value = val; + + this.updateContext(prevType); +}; + + +pp$8.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { return this.readNumber(true) } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { + this.pos += 3; + return this.finishToken(types.ellipsis) + } else { + ++this.pos; + return this.finishToken(types.dot) + } +}; + +pp$8.readToken_slash = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { ++this.pos; return this.readRegexp() } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.slash, 1) +}; + +pp$8.readToken_mult_modulo_exp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types.star : types.modulo; + + if (this.options.ecmaVersion >= 7 && next === 42) { + ++size; + tokentype = types.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + + if (next === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(tokentype, size) +}; + +pp$8.readToken_pipe_amp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2) } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1) +}; + +pp$8.readToken_caret = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.bitwiseXOR, 1) +}; + +pp$8.readToken_plus_min = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next == 45 && this.input.charCodeAt(this.pos + 2) == 62 && + (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$8.readToken_lt_gt = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next == 33 && code == 60 && this.input.charCodeAt(this.pos + 2) == 45 && + this.input.charCodeAt(this.pos + 3) == 45) { + if (this.inModule) { this.unexpected(); } + this.skipLineComment(4); + this.skipSpace(); + return this.nextToken() + } + if (next === 61) { size = 2; } + return this.finishOp(types.relational, size) +}; + +pp$8.readToken_eq_excl = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) } + if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { + this.pos += 2; + return this.finishToken(types.arrow) + } + return this.finishOp(code === 61 ? types.eq : types.prefix, 1) +}; + +pp$8.getTokenFromCode = function(code) { + switch (code) { + case 46: + return this.readToken_dot() + + case 40: ++this.pos; return this.finishToken(types.parenL) + case 41: ++this.pos; return this.finishToken(types.parenR) + case 59: ++this.pos; return this.finishToken(types.semi) + case 44: ++this.pos; return this.finishToken(types.comma) + case 91: ++this.pos; return this.finishToken(types.bracketL) + case 93: ++this.pos; return this.finishToken(types.bracketR) + case 123: ++this.pos; return this.finishToken(types.braceL) + case 125: ++this.pos; return this.finishToken(types.braceR) + case 58: ++this.pos; return this.finishToken(types.colon) + case 63: ++this.pos; return this.finishToken(types.question) + + case 96: + if (this.options.ecmaVersion < 6) { break } + ++this.pos; + return this.finishToken(types.backQuote) + + case 48: + var next = this.input.charCodeAt(this.pos + 1); + if (next === 120 || next === 88) { return this.readRadixNumber(16) } + if (this.options.ecmaVersion >= 6) { + if (next === 111 || next === 79) { return this.readRadixNumber(8) } + if (next === 98 || next === 66) { return this.readRadixNumber(2) } + } + case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: + return this.readNumber(false) + + case 34: case 39: + return this.readString(code) + + + case 47: + return this.readToken_slash() + + case 37: case 42: + return this.readToken_mult_modulo_exp(code) + + case 124: case 38: + return this.readToken_pipe_amp(code) + + case 94: + return this.readToken_caret() + + case 43: case 45: + return this.readToken_plus_min(code) + + case 60: case 62: + return this.readToken_lt_gt(code) + + case 61: case 33: + return this.readToken_eq_excl(code) + + case 126: + return this.finishOp(types.prefix, 1) + } + + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); +}; + +pp$8.finishOp = function(type, size) { + var str = this.input.slice(this.pos, this.pos + size); + this.pos += size; + return this.finishToken(type, str) +}; + + +function tryCreateRegexp(src, flags, throwErrorAt, parser) { + try { + return new RegExp(src, flags) + } catch (e) { + if (throwErrorAt !== undefined) { + if (e instanceof SyntaxError) { parser.raise(throwErrorAt, "Error parsing regular expression: " + e.message); } + throw e + } + } +} + +var regexpUnicodeSupport = !!tryCreateRegexp("\uffff", "u"); + +pp$8.readRegexp = function() { + var this$1 = this; + + var escaped, inClass, start = this.pos; + for (;;) { + if (this$1.pos >= this$1.input.length) { this$1.raise(start, "Unterminated regular expression"); } + var ch = this$1.input.charAt(this$1.pos); + if (lineBreak.test(ch)) { this$1.raise(start, "Unterminated regular expression"); } + if (!escaped) { + if (ch === "[") { inClass = true; } + else if (ch === "]" && inClass) { inClass = false; } + else if (ch === "/" && !inClass) { break } + escaped = ch === "\\"; + } else { escaped = false; } + ++this$1.pos; + } + var content = this.input.slice(start, this.pos); + ++this.pos; + var mods = this.readWord1(); + var tmp = content, tmpFlags = ""; + if (mods) { + var validFlags = /^[gim]*$/; + if (this.options.ecmaVersion >= 6) { validFlags = /^[gimuy]*$/; } + if (!validFlags.test(mods)) { this.raise(start, "Invalid regular expression flag"); } + if (mods.indexOf("u") >= 0) { + if (regexpUnicodeSupport) { + tmpFlags = "u"; + } else { + tmp = tmp.replace(/\\u\{([0-9a-fA-F]+)\}/g, function (_match, code, offset) { + code = Number("0x" + code); + if (code > 0x10FFFF) { this$1.raise(start + offset + 3, "Code point out of bounds"); } + return "x" + }); + tmp = tmp.replace(/\\u([a-fA-F0-9]{4})|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, "x"); + tmpFlags = tmpFlags.replace("u", ""); + } + } + } + var value = null; + if (!isRhino) { + tryCreateRegexp(tmp, tmpFlags, start, this); + value = tryCreateRegexp(content, mods); + } + return this.finishToken(types.regexp, {pattern: content, flags: mods, value: value}) +}; + + +pp$8.readInt = function(radix, len) { + var this$1 = this; + + var start = this.pos, total = 0; + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i) { + var code = this$1.input.charCodeAt(this$1.pos), val = (void 0); + if (code >= 97) { val = code - 97 + 10; } + else if (code >= 65) { val = code - 65 + 10; } + else if (code >= 48 && code <= 57) { val = code - 48; } + else { val = Infinity; } + if (val >= radix) { break } + ++this$1.pos; + total = total * radix + val; + } + if (this.pos === start || len != null && this.pos - start !== len) { return null } + + return total +}; + +pp$8.readRadixNumber = function(radix) { + this.pos += 2; + var val = this.readInt(radix); + if (val == null) { this.raise(this.start + 2, "Expected number in radix " + radix); } + if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } + return this.finishToken(types.num, val) +}; + + +pp$8.readNumber = function(startsWithDot) { + var start = this.pos, isFloat = false, octal = this.input.charCodeAt(this.pos) === 48; + if (!startsWithDot && this.readInt(10) === null) { this.raise(start, "Invalid number"); } + if (octal && this.pos == start + 1) { octal = false; } + var next = this.input.charCodeAt(this.pos); + if (next === 46 && !octal) { + ++this.pos; + this.readInt(10); + isFloat = true; + next = this.input.charCodeAt(this.pos); + } + if ((next === 69 || next === 101) && !octal) { + next = this.input.charCodeAt(++this.pos); + if (next === 43 || next === 45) { ++this.pos; } + if (this.readInt(10) === null) { this.raise(start, "Invalid number"); } + isFloat = true; + } + if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } + + var str = this.input.slice(start, this.pos), val; + if (isFloat) { val = parseFloat(str); } + else if (!octal || str.length === 1) { val = parseInt(str, 10); } + else if (this.strict) { this.raise(start, "Invalid number"); } + else if (/[89]/.test(str)) { val = parseInt(str, 10); } + else { val = parseInt(str, 8); } + return this.finishToken(types.num, val) +}; + + +pp$8.readCodePoint = function() { + var ch = this.input.charCodeAt(this.pos), code; + + if (ch === 123) { + if (this.options.ecmaVersion < 6) { this.unexpected(); } + var codePos = ++this.pos; + code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos); + ++this.pos; + if (code > 0x10FFFF) { this.invalidStringToken(codePos, "Code point out of bounds"); } + } else { + code = this.readHexChar(4); + } + return code +}; + +function codePointToString(code) { + if (code <= 0xFFFF) { return String.fromCharCode(code) } + code -= 0x10000; + return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00) +} + +pp$8.readString = function(quote) { + var this$1 = this; + + var out = "", chunkStart = ++this.pos; + for (;;) { + if (this$1.pos >= this$1.input.length) { this$1.raise(this$1.start, "Unterminated string constant"); } + var ch = this$1.input.charCodeAt(this$1.pos); + if (ch === quote) { break } + if (ch === 92) { + out += this$1.input.slice(chunkStart, this$1.pos); + out += this$1.readEscapedChar(false); + chunkStart = this$1.pos; + } else { + if (isNewLine(ch)) { this$1.raise(this$1.start, "Unterminated string constant"); } + ++this$1.pos; + } + } + out += this.input.slice(chunkStart, this.pos++); + return this.finishToken(types.string, out) +}; + + +var INVALID_TEMPLATE_ESCAPE_ERROR = {}; + +pp$8.tryReadTemplateToken = function() { + this.inTemplateElement = true; + try { + this.readTmplToken(); + } catch (err) { + if (err === INVALID_TEMPLATE_ESCAPE_ERROR) { + this.readInvalidTemplateToken(); + } else { + throw err + } + } + + this.inTemplateElement = false; +}; + +pp$8.invalidStringToken = function(position, message) { + if (this.inTemplateElement && this.options.ecmaVersion >= 9) { + throw INVALID_TEMPLATE_ESCAPE_ERROR + } else { + this.raise(position, message); + } +}; + +pp$8.readTmplToken = function() { + var this$1 = this; + + var out = "", chunkStart = this.pos; + for (;;) { + if (this$1.pos >= this$1.input.length) { this$1.raise(this$1.start, "Unterminated template"); } + var ch = this$1.input.charCodeAt(this$1.pos); + if (ch === 96 || ch === 36 && this$1.input.charCodeAt(this$1.pos + 1) === 123) { + if (this$1.pos === this$1.start && (this$1.type === types.template || this$1.type === types.invalidTemplate)) { + if (ch === 36) { + this$1.pos += 2; + return this$1.finishToken(types.dollarBraceL) + } else { + ++this$1.pos; + return this$1.finishToken(types.backQuote) + } + } + out += this$1.input.slice(chunkStart, this$1.pos); + return this$1.finishToken(types.template, out) + } + if (ch === 92) { + out += this$1.input.slice(chunkStart, this$1.pos); + out += this$1.readEscapedChar(true); + chunkStart = this$1.pos; + } else if (isNewLine(ch)) { + out += this$1.input.slice(chunkStart, this$1.pos); + ++this$1.pos; + switch (ch) { + case 13: + if (this$1.input.charCodeAt(this$1.pos) === 10) { ++this$1.pos; } + case 10: + out += "\n"; + break + default: + out += String.fromCharCode(ch); + break + } + if (this$1.options.locations) { + ++this$1.curLine; + this$1.lineStart = this$1.pos; + } + chunkStart = this$1.pos; + } else { + ++this$1.pos; + } + } +}; + +pp$8.readInvalidTemplateToken = function() { + var this$1 = this; + + for (; this.pos < this.input.length; this.pos++) { + switch (this$1.input[this$1.pos]) { + case "\\": + ++this$1.pos; + break + + case "$": + if (this$1.input[this$1.pos + 1] !== "{") { + break + } + + case "`": + return this$1.finishToken(types.invalidTemplate, this$1.input.slice(this$1.start, this$1.pos)) + + } + } + this.raise(this.start, "Unterminated template"); +}; + + +pp$8.readEscapedChar = function(inTemplate) { + var ch = this.input.charCodeAt(++this.pos); + ++this.pos; + switch (ch) { + case 110: return "\n" + case 114: return "\r" + case 120: return String.fromCharCode(this.readHexChar(2)) + case 117: return codePointToString(this.readCodePoint()) + case 116: return "\t" + case 98: return "\b" + case 118: return "\u000b" + case 102: return "\f" + case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } + case 10: + if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; } + return "" + default: + if (ch >= 48 && ch <= 55) { + var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0]; + var octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + if (octalStr !== "0" && (this.strict || inTemplate)) { + this.invalidStringToken(this.pos - 2, "Octal literal in strict mode"); + } + this.pos += octalStr.length - 1; + return String.fromCharCode(octal) + } + return String.fromCharCode(ch) + } +}; + + +pp$8.readHexChar = function(len) { + var codePos = this.pos; + var n = this.readInt(16, len); + if (n === null) { this.invalidStringToken(codePos, "Bad character escape sequence"); } + return n +}; + + +pp$8.readWord1 = function() { + var this$1 = this; + + this.containsEsc = false; + var word = "", first = true, chunkStart = this.pos; + var astral = this.options.ecmaVersion >= 6; + while (this.pos < this.input.length) { + var ch = this$1.fullCharCodeAtPos(); + if (isIdentifierChar(ch, astral)) { + this$1.pos += ch <= 0xffff ? 1 : 2; + } else if (ch === 92) { + this$1.containsEsc = true; + word += this$1.input.slice(chunkStart, this$1.pos); + var escStart = this$1.pos; + if (this$1.input.charCodeAt(++this$1.pos) != 117) + { this$1.invalidStringToken(this$1.pos, "Expecting Unicode escape sequence \\uXXXX"); } + ++this$1.pos; + var esc = this$1.readCodePoint(); + if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) + { this$1.invalidStringToken(escStart, "Invalid Unicode escape"); } + word += codePointToString(esc); + chunkStart = this$1.pos; + } else { + break + } + first = false; + } + return word + this.input.slice(chunkStart, this.pos) +}; + + +pp$8.readWord = function() { + var word = this.readWord1(); + var type = types.name; + if (this.keywords.test(word)) { + if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword " + word); } + type = keywords$1[word]; + } + return this.finishToken(type, word) +}; + + +var version = "5.1.1"; + + +function parse(input, options) { + return new Parser(options, input).parse() +} + + +function parseExpressionAt(input, pos, options) { + var p = new Parser(options, input, pos); + p.nextToken(); + return p.parseExpression() +} + + +function tokenizer(input, options) { + return new Parser(options, input) +} + +function addLooseExports(parse, Parser$$1, plugins$$1) { + exports.parse_dammit = parse; + exports.LooseParser = Parser$$1; + exports.pluginsLoose = plugins$$1; +} + +exports.version = version; +exports.parse = parse; +exports.parseExpressionAt = parseExpressionAt; +exports.tokenizer = tokenizer; +exports.addLooseExports = addLooseExports; +exports.Parser = Parser; +exports.plugins = plugins; +exports.defaultOptions = defaultOptions; +exports.Position = Position; +exports.SourceLocation = SourceLocation; +exports.getLineInfo = getLineInfo; +exports.Node = Node; +exports.TokenType = TokenType; +exports.tokTypes = types; +exports.keywordTypes = keywords$1; +exports.TokContext = TokContext; +exports.tokContexts = types$1; +exports.isIdentifierChar = isIdentifierChar; +exports.isIdentifierStart = isIdentifierStart; +exports.Token = Token; +exports.isNewLine = isNewLine; +exports.lineBreak = lineBreak; +exports.lineBreakG = lineBreakG; +exports.nonASCIIwhitespace = nonASCIIwhitespace; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{}],27:[function(require,module,exports){ + +},{}]},{},[25]); diff --git a/play/js/gpu.js-develop/bin/gpu.min.js b/play/js/gpu.js-develop/bin/gpu.min.js new file mode 100644 index 00000000..f8baa019 --- /dev/null +++ b/play/js/gpu.js-develop/bin/gpu.min.js @@ -0,0 +1,19 @@ +/** + * gpu.js + * http://gpu.rocks/ + * + * GPU Accelerated JavaScript + * + * @version 0.0.0 + * @date Mon Jul 24 2017 11:49:41 GMT+0800 (+08) + * + * @license MIT + * The MIT License + * + * Copyright (c) 2017 gpu.js Team + */ +"use strict";!function t(e,n,i){function r(a,o){if(!n[a]){if(!e[a]){var u="function"==typeof require&&require;if(!o&&u)return u(a,!0);if(s)return s(a,!0);var h=new Error("Cannot find module '"+a+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[a]={exports:{}};e[a][0].call(l.exports,function(t){var n=e[a][1][t];return r(n?n:t)},l,l.exports,t,e,n,i)}return n[a].exports}for(var s="function"==typeof require&&require,a=0;a {\n "+r.toString()+";\n const utils = {\n allPropertiesOf: function "+i.allPropertiesOf.toString()+",\n clone: function "+i.clone.toString()+",\n /*splitArray: function "+i.splitArray.toString()+",\n getArgumentType: function "+i.getArgumentType.toString()+",\n getDimensions: function "+i.getDimensions.toString()+",\n dimToTexSize: function "+i.dimToTexSize.toString()+",\n copyFlatten: function "+i.copyFlatten.toString()+",\n flatten: function "+i.flatten.toString()+",\n systemEndianness: '"+i.systemEndianness()+"',\n initWebGl: function "+i.initWebGl.toString()+",\n isArray: function "+i.isArray.toString()+"*/\n };\n class "+(e||"Kernel")+" {\n constructor() { \n this.argumentsLength = 0;\n this._canvas = null;\n this._webGl = null;\n this.built = false;\n this.program = null;\n this.paramNames = "+JSON.stringify(t.paramNames)+";\n this.paramTypes = "+JSON.stringify(t.paramTypes)+";\n this.texSize = "+JSON.stringify(t.texSize)+";\n this.dimensions = "+JSON.stringify(t.dimensions)+";\n this._kernelString = `"+t._kernelString+"`;\n\t\t this.run = function() {\n this.run = null;\n this.build();\n return this.run.apply(this, arguments);\n }.bind(this);\n this.thread = {\n x: 0,\n y: 0,\n z: 0\n };\n this.runDimensions = {\n x: null,\n y: null,\n z: null\n };\n }\n setCanvas(canvas) { this._canvas = canvas; return this; }\n setWebGl(webGl) { this._webGl = webGl; return this; }\n "+t.build.toString()+"\n run () { "+t.kernelString+" }\n getKernelString() { return this._kernelString; }\n };\n return kernelRunShortcut(new Kernel());\n };"}},{"../../core/utils":24,"../kernel-run-shortcut":9}],4:[function(t,e,n){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=0);else{e.push(t),n&&(i.parent=n,i.constants=n.constants),i.getFunctionString();for(var r=0;r ("+i.length+","+this.paramNames.length+")";this.paramTypes=i}else if("object"===("undefined"==typeof i?"undefined":_typeof(i))){var s=Object.keys(i);if(i.hasOwnProperty("returns")&&(this.returnType=i.returns,s.splice(s.indexOf("returns"),1)),s.length>0&&s.length!==this.paramNames.length)throw"Invalid argument type array length, against function length -> ("+s.length+","+this.paramNames.length+")";this.paramTypes=this.paramNames.map(function(t){return i.hasOwnProperty(t)?i[t]:"float"})}}else this.paramTypes=[];this.returnType||(this.returnType=r||"float")}return _createClass(BaseFunctionNode,[{key:"setAddFunction",value:function(t){return this.addFunction=t,this}},{key:"getJsFunction",value:function getJsFunction(){if(this.jsFunction)return this.jsFunction;if(this.jsFunctionString)return this.jsFunction=eval(this.jsFunctionString),this.jsFunction;throw"Missing jsFunction, and jsFunctionString parameter"}},{key:"getJsAST",value:function(t){if(this.jsFunctionAST)return this.jsFunctionAST;if(t=t||acorn,null===t)throw"Missing JS to AST parser";var e=t.parse("var "+this.functionName+" = "+this.jsFunctionString+";");if(null===e)throw"Failed to parse JS code";var n=e.body[0].declarations[0].init;return this.jsFunctionAST=n,n}},{key:"getFunctionString",value:function(){return this.generate(),this.functionString}},{key:"setFunctionString",value:function(t){this.functionString=t}},{key:"getParamType",value:function(t){var e=this.paramNames.indexOf(t);if(e===-1)return null;if(!this.parent)return null;if(this.paramTypes[e])return this.paramTypes[e];for(var n=this.parent.calledFunctionsArguments[this.functionName],i=0;i0&&e.push(", ");var s=n.getParamType(r);switch(s){case"Texture":case"Array":e.push("sampler2D");break;default:e.push("float")}e.push(" "),e.push("user_"),e.push(r)}e.push(") {\n");for(var a=0;a0&&e.push(","),this.astGeneric(t.declarations[i],e,n);return e.push(";"),e}},{key:"astVariableDeclarator",value:function(t,e,n){return this.astGeneric(t.id,e,n),null!==t.init&&(e.push("="),this.astGeneric(t.init,e,n)),e}},{key:"astIfStatement",value:function(t,e,n){return e.push("if ("),this.astGeneric(t.test,e,n),e.push(")"),"BlockStatement"===t.consequent.type?this.astGeneric(t.consequent,e,n):(e.push(" {\n"),this.astGeneric(t.consequent,e,n),e.push("\n}\n")),t.alternate&&(e.push("else "),"BlockStatement"===t.alternate.type?this.astGeneric(t.alternate,e,n):(e.push(" {\n"),this.astGeneric(t.alternate,e,n),e.push("\n}\n"))),e}},{key:"astBreakStatement",value:function(t,e,n){return e.push("break;\n"),e}},{key:"astContinueStatement",value:function(t,e,n){return e.push("continue;\n"),e}},{key:"astLogicalExpression",value:function(t,e,n){return e.push("("),this.astGeneric(t.left,e,n),e.push(t.operator),this.astGeneric(t.right,e,n),e.push(")"),e}},{key:"astUpdateExpression",value:function(t,e,n){return t.prefix?(e.push(t.operator),this.astGeneric(t.argument,e,n)):(this.astGeneric(t.argument,e,n),e.push(t.operator)),e}},{key:"astUnaryExpression",value:function(t,e,n){return t.prefix?(e.push(t.operator),this.astGeneric(t.argument,e,n)):(this.astGeneric(t.argument,e,n),e.push(t.operator)),e}},{key:"astThisExpression",value:function(t,e,n){return e.push("this"),e}},{key:"astMemberExpression",value:function(t,e,n){if(t.computed)if("Identifier"===t.object.type){var i=t.object.name,r=(n.functionName||"kernel",!1);if(n.paramNames){var s=n.paramNames.indexOf(i);s>=0&&"float"===n.paramTypes[s]&&(r=!0)}r?(this.astGeneric(t.object,e,n),e.push("[int("),this.astGeneric(t.property,e,n),e.push(")]")):(e.push("get("),this.astGeneric(t.object,e,n),e.push(", vec2("),this.astGeneric(t.object,e,n),e.push("Size[0],"),this.astGeneric(t.object,e,n),e.push("Size[1]), vec3("),this.astGeneric(t.object,e,n),e.push("Dim[0],"),this.astGeneric(t.object,e,n),e.push("Dim[1],"),this.astGeneric(t.object,e,n),e.push("Dim[2]"),e.push("), "),this.astGeneric(t.property,e,n),e.push(")"))}else{this.astGeneric(t.object,e,n);var a=e.pop();e.push(","),this.astGeneric(t.property,e,n),e.push(a)}else{var o=this.astMemberExpressionUnroll(t),u=o.toLowerCase();0===o.indexOf(f)&&(o="constants_"+o.slice(f.length)),"this.thread.x"===u?e.push("threadId.x"):"this.thread.y"===u?e.push("threadId.y"):"this.thread.z"===u?e.push("threadId.z"):"this.dimensions.x"===u?e.push("uOutputDim.x"):"this.dimensions.y"===u?e.push("uOutputDim.y"):"this.dimensions.z"===u?e.push("uOutputDim.z"):e.push(o)}return e}},{key:"astSequenceExpression",value:function(t,e,n){for(var i=0;i0&&e.push(","),this.astGeneric(t.expressions,e,n);return e}},{key:"astMemberExpressionUnroll",value:function(t,e){if("Identifier"===t.type)return t.name;if("ThisExpression"===t.type)return"this";if("MemberExpression"===t.type&&t.object&&t.property)return this.astMemberExpressionUnroll(t.object,e)+"."+this.astMemberExpressionUnroll(t.property,e);throw o("Unknown CallExpression_unroll",t,e)}},{key:"astCallExpression",value:function(t,e,n){if(t.callee){var i=this.astMemberExpressionUnroll(t.callee);0===i.indexOf(c)&&(i=i.slice(c.length)),0===i.indexOf(p)&&(i=i.slice(p.length)),n.calledFunctions.indexOf(i)<0&&n.calledFunctions.push(i),n.hasOwnProperty("funcName")||(n.calledFunctionsArguments[i]=[]);var r=[];n.calledFunctionsArguments[i].push(r),e.push(i),e.push("(");for(var s=0;s0&&e.push(", "),this.astGeneric(a,e,n),"Identifier"===a.type){var u=n.paramNames.indexOf(a.name);u===-1?r.push(null):r.push({name:a.name,type:n.paramTypes[u]})}else r.push(null)}return e.push(")"),e}throw o("Unknown CallExpression",t,n)}},{key:"astArrayExpression",value:function(t,e,n){var i=t.elements.length;e.push("float["+i+"](");for(var r=0;r0&&e.push(", ");var s=t.elements[r];this.astGeneric(s,e,n)}return e.push(")"),e}},{key:"getFunctionPrototypeString",value:function(){return this.webGlFunctionPrototypeString?this.webGlFunctionPrototypeString:this.webGlFunctionPrototypeString=this.generate()}},{key:"build",value:function(){return this.getFunctionPrototypeString().length>0}}],[{key:"astFunctionPrototype",value:function(t,e,n){if(n.isRootKernel||n.isSubKernel)return e;e.push(n.returnType),e.push(" "),e.push(n.functionName),e.push("(");for(var i=0;i0&&e.push(", "),e.push(n.paramTypes[i]),e.push(" "),e.push("user_"),e.push(n.paramNames[i]);return e.push(");\n"),e}}]),e}(h)},{"../../core/utils":24,"../function-node-base":7}],13:[function(t,e,n){var i=t("../../core/utils"),r=t("../kernel-run-shortcut");e.exports=function(t,e){return"() => {\n "+r.toString()+";\n const utils = {\n allPropertiesOf: function "+i.allPropertiesOf.toString()+",\n clone: function "+i.clone.toString()+",\n splitArray: function "+i.splitArray.toString()+",\n getArgumentType: function "+i.getArgumentType.toString()+",\n getDimensions: function "+i.getDimensions.toString()+",\n dimToTexSize: function "+i.dimToTexSize.toString()+",\n copyFlatten: function "+i.copyFlatten.toString()+",\n flatten: function "+i.flatten.toString()+",\n systemEndianness: '"+i.systemEndianness()+"',\n initWebGl: function "+i.initWebGl.toString()+",\n isArray: function "+i.isArray.toString()+"\n };\n class "+(e||"Kernel")+" {\n constructor() {\n this.argumentsLength = 0;\n this._canvas = null;\n this._webGl = null;\n this.built = false;\n this.program = null;\n this.paramNames = "+JSON.stringify(t.paramNames)+";\n this.paramTypes = "+JSON.stringify(t.paramTypes)+";\n this.texSize = "+JSON.stringify(t.texSize)+";\n this.dimensions = "+JSON.stringify(t.dimensions)+";\n this.compiledFragShaderString = `"+t.compiledFragShaderString+"`;\n\t\t this.compiledVertShaderString = `"+t.compiledVertShaderString+"`;\n\t\t this.programUniformLocationCache = {};\n\t\t this.textureCache = {};\n\t\t this.subKernelOutputTextures = null;\n }\n "+t._getFragShaderString.toString()+"\n "+t._getVertShaderString.toString()+"\n validateOptions() {}\n setupParams() {}\n setCanvas(canvas) { this._canvas = canvas; return this; }\n setWebGl(webGl) { this._webGl = webGl; return this; }\n "+t.getUniformLocation.toString()+"\n "+t.setupParams.toString()+"\n "+t.build.toString()+"\n\t\t "+t.run.toString()+"\n\t\t "+t._addArgument.toString()+"\n\t\t "+t.getArgumentTexture.toString()+"\n\t\t "+t.getTextureCache.toString()+"\n\t\t "+t.getOutputTexture.toString()+"\n\t\t "+t.renderOutput.toString()+"\n };\n return kernelRunShortcut(new Kernel());\n };"}},{"../../core/utils":24,"../kernel-run-shortcut":9}],14:[function(t,e,n){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?t.join(";\n")+";\n":"\n"}},{key:"_replaceArtifacts",value:function(t,e){return t.replace(/[ ]*__([A-Z]+[0-9]*([_]?[A-Z])*)__;\n/g,function(t,n){if(e.hasOwnProperty(n))return e[n];throw"unhandled artifact "+n})}},{key:"_addKernels",value:function(){var t=this.functionBuilder,e=this._webGl;if(t.addKernel(this.fnString,{prototypeOnly:!1,constants:this.constants,debug:this.debug,loopMaxIterations:this.loopMaxIterations},this.paramNames,this.paramTypes),null!==this.subKernels){var n=this.ext=e.getExtension("WEBGL_draw_buffers");if(!n)throw new Error("could not instantiate draw buffers extension");this.subKernelOutputTextures=[],this.subKernelOutputVariableNames=[];for(var i=0;it)return!1;if(n+=e[i+1],n>=t)return!0}}function n(t,n){return t<65?36===t:t<91||(t<97?95===t:t<123||(t<=65535?t>=170&&w.test(String.fromCharCode(t)):n!==!1&&e(t,A)))}function i(t,n){return t<48?36===t:t<58||!(t<65)&&(t<91||(t<97?95===t:t<123||(t<=65535?t>=170&&T.test(String.fromCharCode(t)):n!==!1&&(e(t,A)||e(t,O)))))}function r(t,e){return new C(t,{beforeExpr:!0,binop:e})}function s(t,e){return void 0===e&&(e={}),e.keyword=t,F[t]=new C(t,e)}function a(t){return 10===t||13===t||8232===t||8233===t}function o(t,e){return M.call(t,e)}function u(t,e){for(var n=1,i=0;;){D.lastIndex=i;var r=D.exec(t);if(!(r&&r.index=2015&&(e.ecmaVersion-=2009),null==e.allowReserved&&(e.allowReserved=e.ecmaVersion<5),U(e.onToken)){var i=e.onToken;e.onToken=function(t){return i.push(t)}}return U(e.onComment)&&(e.onComment=l(e,e.onComment)),e}function l(t,e){return function(n,i,r,s,a,o){var u={type:n?"Block":"Line",value:i,start:r,end:s};t.locations&&(u.loc=new K(this,a,o)),t.ranges&&(u.range=[r,s]),e.push(u)}}function c(t){return new RegExp("^(?:"+t.replace(/ /g,"|")+")$")}function p(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=-1}function f(t,e,n,i){return t.type=e,t.end=n,this.options.locations&&(t.loc.end=i),this.options.ranges&&(t.range[1]=n),t}function d(t,e,n,i){try{return new RegExp(t,e)}catch(r){if(void 0!==n)throw r instanceof SyntaxError&&i.raise(n,"Error parsing regular expression: "+r.message),r}}function m(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(1023&t)+56320))}function g(t,e){return new X(e,t).parse()}function y(t,e,n){var i=new X(n,t,e);return i.nextToken(),i.parseExpression()}function b(t,e){return new X(e,t)}function v(e,n,i){t.parse_dammit=e,t.LooseParser=n,t.pluginsLoose=i}var x={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},k="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",_={5:k,6:k+" const class extends export import super"},S="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢴࢶ-ࢽऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿕ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞮꞰ-ꞷꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭥꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",E="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣔ-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఃా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ູົຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱꤀-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",w=new RegExp("["+S+"]"),T=new RegExp("["+S+E+"]");S=E=null;var A=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541],O=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239],C=function(t,e){void 0===e&&(e={}),this.label=t,this.keyword=e.keyword,this.beforeExpr=!!e.beforeExpr,this.startsExpr=!!e.startsExpr,this.isLoop=!!e.isLoop,this.isAssign=!!e.isAssign,this.prefix=!!e.prefix,this.postfix=!!e.postfix,this.binop=e.binop||null,this.updateContext=null},N={beforeExpr:!0},P={startsExpr:!0},F={},R={num:new C("num",P),regexp:new C("regexp",P),string:new C("string",P),name:new C("name",P),eof:new C("eof"),bracketL:new C("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new C("]"),braceL:new C("{",{beforeExpr:!0,startsExpr:!0}),braceR:new C("}"),parenL:new C("(",{beforeExpr:!0,startsExpr:!0}),parenR:new C(")"),comma:new C(",",N),semi:new C(";",N),colon:new C(":",N),dot:new C("."),question:new C("?",N),arrow:new C("=>",N),template:new C("template"),invalidTemplate:new C("invalidTemplate"),ellipsis:new C("...",N),backQuote:new C("`",P),dollarBraceL:new C("${",{beforeExpr:!0,startsExpr:!0}),eq:new C("=",{beforeExpr:!0,isAssign:!0}),assign:new C("_=",{beforeExpr:!0,isAssign:!0}),incDec:new C("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new C("prefix",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:r("||",1),logicalAND:r("&&",2),bitwiseOR:r("|",3),bitwiseXOR:r("^",4),bitwiseAND:r("&",5),equality:r("==/!=",6),relational:r("",7),bitShift:r("<>",8),plusMin:new C("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:r("%",10),star:r("*",10),slash:r("/",10),starstar:new C("**",{beforeExpr:!0}),_break:s("break"),_case:s("case",N),_catch:s("catch"),_continue:s("continue"),_debugger:s("debugger"),_default:s("default",N),_do:s("do",{isLoop:!0,beforeExpr:!0}),_else:s("else",N),_finally:s("finally"),_for:s("for",{isLoop:!0}),_function:s("function",P),_if:s("if"),_return:s("return",N),_switch:s("switch"),_throw:s("throw",N),_try:s("try"),_var:s("var"),_const:s("const"),_while:s("while",{isLoop:!0}),_with:s("with"),_new:s("new",{beforeExpr:!0,startsExpr:!0}),_this:s("this",P),_super:s("super",P),_class:s("class",P),_extends:s("extends",N),_export:s("export"),_import:s("import"),_null:s("null",P),_true:s("true",P),_false:s("false",P),_in:s("in",{beforeExpr:!0,binop:7}),_instanceof:s("instanceof",{beforeExpr:!0,binop:7}),_typeof:s("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:s("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:s("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},L=/\r\n?|\n|\u2028|\u2029/,D=new RegExp(L.source,"g"),I=/[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/,G=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,j=Object.prototype,M=j.hasOwnProperty,V=j.toString,U=Array.isArray||function(t){return"[object Array]"===V.call(t)},B=function(t,e){this.line=t,this.column=e};B.prototype.offset=function(t){return new B(this.line,this.column+t)};var K=function(t,e,n){this.start=e,this.end=n,null!==t.sourceFile&&(this.source=t.sourceFile)},z={ecmaVersion:7,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowHashBang:!1,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1,plugins:{}},W={},X=function(t,e,n){this.options=t=h(t),this.sourceFile=t.sourceFile,this.keywords=c(_[t.ecmaVersion>=6?6:5]);var i="";if(!t.allowReserved){for(var r=t.ecmaVersion;!(i=x[r]);r--);"module"==t.sourceType&&(i+=" await")}this.reservedWords=c(i);var s=(i?i+" ":"")+x.strict;this.reservedWordsStrict=c(s),this.reservedWordsStrictBind=c(s+" "+x.strictBind),this.input=String(e),this.containsEsc=!1,this.loadPlugins(t.plugins),n?(this.pos=n,this.lineStart=this.input.lastIndexOf("\n",n-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(L).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=R.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===t.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.inFunction=this.inGenerator=this.inAsync=!1,this.yieldPos=this.awaitPos=0,this.labels=[],0===this.pos&&t.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterFunctionScope()};X.prototype.isKeyword=function(t){return this.keywords.test(t)},X.prototype.isReservedWord=function(t){return this.reservedWords.test(t)},X.prototype.extend=function(t,e){this[t]=e(this[t])},X.prototype.loadPlugins=function(t){var e=this;for(var n in t){var i=W[n];if(!i)throw new Error("Plugin '"+n+"' not found");i(e,t[n])}},X.prototype.parse=function(){var t=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(t)};var q=X.prototype,Y=/^(?:'((?:[^']|\.)*)'|"((?:[^"]|\.)*)"|;)/;q.strictDirective=function(t){for(var e=this;;){G.lastIndex=t,t+=G.exec(e.input)[0].length;var n=Y.exec(e.input.slice(t));if(!n)return!1;if("use strict"==(n[1]||n[2]))return!0;t+=n[0].length}},q.eat=function(t){return this.type===t&&(this.next(),!0)},q.isContextual=function(t){return this.type===R.name&&this.value===t},q.eatContextual=function(t){return this.value===t&&this.eat(R.name)},q.expectContextual=function(t){this.eatContextual(t)||this.unexpected()},q.canInsertSemicolon=function(){return this.type===R.eof||this.type===R.braceR||L.test(this.input.slice(this.lastTokEnd,this.start))},q.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},q.semicolon=function(){this.eat(R.semi)||this.insertSemicolon()||this.unexpected()},q.afterTrailingComma=function(t,e){if(this.type==t)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),e||this.next(),!0},q.expect=function(t){this.eat(t)||this.unexpected()},q.unexpected=function(t){this.raise(null!=t?t:this.start,"Unexpected token")},q.checkPatternErrors=function(t,e){if(t){t.trailingComma>-1&&this.raiseRecoverable(t.trailingComma,"Comma is not permitted after the rest element");var n=e?t.parenthesizedAssign:t.parenthesizedBind;n>-1&&this.raiseRecoverable(n,"Parenthesized pattern")}},q.checkExpressionErrors=function(t,e){var n=t?t.shorthandAssign:-1;return e?void(n>-1&&this.raise(n,"Shorthand property assignments are valid only in destructuring patterns")):n>=0},q.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos=6&&(t.sourceType=this.options.sourceType),this.finishNode(t,"Program")};var J={kind:"loop"},$={kind:"switch"};H.isLet=function(){if(this.type!==R.name||this.options.ecmaVersion<6||"let"!=this.value)return!1;G.lastIndex=this.pos;var t=G.exec(this.input),e=this.pos+t[0].length,r=this.input.charCodeAt(e);if(91===r||123==r)return!0;if(n(r,!0)){for(var s=e+1;i(this.input.charCodeAt(s),!0);)++s;var a=this.input.slice(e,s);if(!this.isKeyword(a))return!0}return!1},H.isAsyncFunction=function(){if(this.type!==R.name||this.options.ecmaVersion<8||"async"!=this.value)return!1;G.lastIndex=this.pos;var t=G.exec(this.input),e=this.pos+t[0].length;return!(L.test(this.input.slice(this.pos,e))||"function"!==this.input.slice(e,e+8)||e+8!=this.input.length&&i(this.input.charAt(e+8)))},H.parseStatement=function(t,e,n){var i,r=this.type,s=this.startNode();switch(this.isLet()&&(r=R._var,i="let"),r){case R._break:case R._continue:return this.parseBreakContinueStatement(s,r.keyword);case R._debugger:return this.parseDebuggerStatement(s);case R._do:return this.parseDoStatement(s);case R._for:return this.parseForStatement(s);case R._function:return!t&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1);case R._class:return t||this.unexpected(),this.parseClass(s,!0);case R._if:return this.parseIfStatement(s);case R._return:return this.parseReturnStatement(s);case R._switch:return this.parseSwitchStatement(s);case R._throw:return this.parseThrowStatement(s);case R._try:return this.parseTryStatement(s);case R._const:case R._var:return i=i||this.value,t||"var"==i||this.unexpected(),this.parseVarStatement(s,i);case R._while:return this.parseWhileStatement(s);case R._with:return this.parseWithStatement(s);case R.braceL:return this.parseBlock();case R.semi:return this.parseEmptyStatement(s);case R._export:case R._import:return this.options.allowImportExportEverywhere||(e||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),r===R._import?this.parseImport(s):this.parseExport(s,n);default:if(this.isAsyncFunction()&&t)return this.next(),this.parseFunctionStatement(s,!0);var a=this.value,o=this.parseExpression();return r===R.name&&"Identifier"===o.type&&this.eat(R.colon)?this.parseLabeledStatement(s,a,o):this.parseExpressionStatement(s,o)}},H.parseBreakContinueStatement=function(t,e){var n=this,i="break"==e;this.next(),this.eat(R.semi)||this.insertSemicolon()?t.label=null:this.type!==R.name?this.unexpected():(t.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(R.semi):this.semicolon(),this.finishNode(t,"DoWhileStatement")},H.parseForStatement=function(t){if(this.next(),this.labels.push(J),this.enterLexicalScope(),this.expect(R.parenL),this.type===R.semi)return this.parseFor(t,null);var e=this.isLet();if(this.type===R._var||this.type===R._const||e){var n=this.startNode(),i=e?"let":this.value;return this.next(),this.parseVar(n,!0,i),this.finishNode(n,"VariableDeclaration"),!(this.type===R._in||this.options.ecmaVersion>=6&&this.isContextual("of"))||1!==n.declarations.length||"var"!==i&&n.declarations[0].init?this.parseFor(t,n):this.parseForIn(t,n)}var r=new p,s=this.parseExpression(!0,r);return this.type===R._in||this.options.ecmaVersion>=6&&this.isContextual("of")?(this.toAssignable(s),this.checkLVal(s),this.checkPatternErrors(r,!0),this.parseForIn(t,s)):(this.checkExpressionErrors(r,!0),this.parseFor(t,s))},H.parseFunctionStatement=function(t,e){ +return this.next(),this.parseFunction(t,!0,!1,e)},H.isFunction=function(){return this.type===R._function||this.isAsyncFunction()},H.parseIfStatement=function(t){return this.next(),t.test=this.parseParenExpression(),t.consequent=this.parseStatement(!this.strict&&this.isFunction()),t.alternate=this.eat(R._else)?this.parseStatement(!this.strict&&this.isFunction()):null,this.finishNode(t,"IfStatement")},H.parseReturnStatement=function(t){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(R.semi)||this.insertSemicolon()?t.argument=null:(t.argument=this.parseExpression(),this.semicolon()),this.finishNode(t,"ReturnStatement")},H.parseSwitchStatement=function(t){var e=this;this.next(),t.discriminant=this.parseParenExpression(),t.cases=[],this.expect(R.braceL),this.labels.push($),this.enterLexicalScope();for(var n,i=!1;this.type!=R.braceR;)if(e.type===R._case||e.type===R._default){var r=e.type===R._case;n&&e.finishNode(n,"SwitchCase"),t.cases.push(n=e.startNode()),n.consequent=[],e.next(),r?n.test=e.parseExpression():(i&&e.raiseRecoverable(e.lastTokStart,"Multiple default clauses"),i=!0,n.test=null),e.expect(R.colon)}else n||e.unexpected(),n.consequent.push(e.parseStatement(!0));return this.exitLexicalScope(),n&&this.finishNode(n,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(t,"SwitchStatement")},H.parseThrowStatement=function(t){return this.next(),L.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),t.argument=this.parseExpression(),this.semicolon(),this.finishNode(t,"ThrowStatement")};var Q=[];H.parseTryStatement=function(t){if(this.next(),t.block=this.parseBlock(),t.handler=null,this.type===R._catch){var e=this.startNode();this.next(),this.expect(R.parenL),e.param=this.parseBindingAtom(),this.enterLexicalScope(),this.checkLVal(e.param,"let"),this.expect(R.parenR),e.body=this.parseBlock(!1),this.exitLexicalScope(),t.handler=this.finishNode(e,"CatchClause")}return t.finalizer=this.eat(R._finally)?this.parseBlock():null,t.handler||t.finalizer||this.raise(t.start,"Missing catch or finally clause"),this.finishNode(t,"TryStatement")},H.parseVarStatement=function(t,e){return this.next(),this.parseVar(t,!1,e),this.semicolon(),this.finishNode(t,"VariableDeclaration")},H.parseWhileStatement=function(t){return this.next(),t.test=this.parseParenExpression(),this.labels.push(J),t.body=this.parseStatement(!1),this.labels.pop(),this.finishNode(t,"WhileStatement")},H.parseWithStatement=function(t){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),t.object=this.parseParenExpression(),t.body=this.parseStatement(!1),this.finishNode(t,"WithStatement")},H.parseEmptyStatement=function(t){return this.next(),this.finishNode(t,"EmptyStatement")},H.parseLabeledStatement=function(t,e,n){for(var i=this,r=0,s=i.labels;r=0;u--){var h=i.labels[u];if(h.statementStart!=t.start)break;h.statementStart=i.start,h.kind=o}return this.labels.push({name:e,kind:o,statementStart:this.start}),t.body=this.parseStatement(!0),("ClassDeclaration"==t.body.type||"VariableDeclaration"==t.body.type&&"var"!=t.body.kind||"FunctionDeclaration"==t.body.type&&(this.strict||t.body.generator))&&this.raiseRecoverable(t.body.start,"Invalid labeled declaration"),this.labels.pop(),t.label=n,this.finishNode(t,"LabeledStatement")},H.parseExpressionStatement=function(t,e){return t.expression=e,this.semicolon(),this.finishNode(t,"ExpressionStatement")},H.parseBlock=function(t){var e=this;void 0===t&&(t=!0);var n=this.startNode();for(n.body=[],this.expect(R.braceL),t&&this.enterLexicalScope();!this.eat(R.braceR);){var i=e.parseStatement(!0);n.body.push(i)}return t&&this.exitLexicalScope(),this.finishNode(n,"BlockStatement")},H.parseFor=function(t,e){return t.init=e,this.expect(R.semi),t.test=this.type===R.semi?null:this.parseExpression(),this.expect(R.semi),t.update=this.type===R.parenR?null:this.parseExpression(),this.expect(R.parenR),this.exitLexicalScope(),t.body=this.parseStatement(!1),this.labels.pop(),this.finishNode(t,"ForStatement")},H.parseForIn=function(t,e){var n=this.type===R._in?"ForInStatement":"ForOfStatement";return this.next(),t.left=e,t.right=this.parseExpression(),this.expect(R.parenR),this.exitLexicalScope(),t.body=this.parseStatement(!1),this.labels.pop(),this.finishNode(t,n)},H.parseVar=function(t,e,n){var i=this;for(t.declarations=[],t.kind=n;;){var r=i.startNode();if(i.parseVarId(r,n),i.eat(R.eq)?r.init=i.parseMaybeAssign(e):"const"!==n||i.type===R._in||i.options.ecmaVersion>=6&&i.isContextual("of")?"Identifier"==r.id.type||e&&(i.type===R._in||i.isContextual("of"))?r.init=null:i.raise(i.lastTokEnd,"Complex binding patterns require an initialization value"):i.unexpected(),t.declarations.push(i.finishNode(r,"VariableDeclarator")),!i.eat(R.comma))break}return t},H.parseVarId=function(t,e){t.id=this.parseBindingAtom(e),this.checkLVal(t.id,e,!1)},H.parseFunction=function(t,e,n,i){this.initFunction(t),this.options.ecmaVersion>=6&&!i&&(t.generator=this.eat(R.star)),this.options.ecmaVersion>=8&&(t.async=!!i),e&&(t.id="nullableID"===e&&this.type!=R.name?null:this.parseIdent(),t.id&&this.checkLVal(t.id,"var"));var r=this.inGenerator,s=this.inAsync,a=this.yieldPos,o=this.awaitPos,u=this.inFunction;return this.inGenerator=t.generator,this.inAsync=t.async,this.yieldPos=0,this.awaitPos=0,this.inFunction=!0,this.enterFunctionScope(),e||(t.id=this.type==R.name?this.parseIdent():null),this.parseFunctionParams(t),this.parseFunctionBody(t,n),this.inGenerator=r,this.inAsync=s,this.yieldPos=a,this.awaitPos=o,this.inFunction=u,this.finishNode(t,e?"FunctionDeclaration":"FunctionExpression")},H.parseFunctionParams=function(t){this.expect(R.parenL),t.params=this.parseBindingList(R.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},H.parseClass=function(t,e){var n=this;this.next(),this.parseClassId(t,e),this.parseClassSuper(t);var i=this.startNode(),r=!1;for(i.body=[],this.expect(R.braceL);!this.eat(R.braceR);)if(!n.eat(R.semi)){var s=n.startNode(),a=n.eat(R.star),o=!1,u=n.type===R.name&&"static"===n.value;n.parsePropertyName(s),s["static"]=u&&n.type!==R.parenL,s["static"]&&(a&&n.unexpected(),a=n.eat(R.star),n.parsePropertyName(s)),n.options.ecmaVersion>=8&&!a&&!s.computed&&"Identifier"===s.key.type&&"async"===s.key.name&&n.type!==R.parenL&&!n.canInsertSemicolon()&&(o=!0,n.parsePropertyName(s)),s.kind="method";var h=!1;if(!s.computed){var l=s.key;a||o||"Identifier"!==l.type||n.type===R.parenL||"get"!==l.name&&"set"!==l.name||(h=!0,s.kind=l.name,l=n.parsePropertyName(s)),!s["static"]&&("Identifier"===l.type&&"constructor"===l.name||"Literal"===l.type&&"constructor"===l.value)&&(r&&n.raise(l.start,"Duplicate constructor in the same class"),h&&n.raise(l.start,"Constructor can't have get/set modifier"),a&&n.raise(l.start,"Constructor can't be a generator"),o&&n.raise(l.start,"Constructor can't be an async method"),s.kind="constructor",r=!0)}if(n.parseClassMethod(i,s,a,o),h){var c="get"===s.kind?0:1;if(s.value.params.length!==c){var p=s.value.start;"get"===s.kind?n.raiseRecoverable(p,"getter should have no params"):n.raiseRecoverable(p,"setter should have exactly one param")}else"set"===s.kind&&"RestElement"===s.value.params[0].type&&n.raiseRecoverable(s.value.params[0].start,"Setter cannot use rest params")}}return t.body=this.finishNode(i,"ClassBody"),this.finishNode(t,e?"ClassDeclaration":"ClassExpression")},H.parseClassMethod=function(t,e,n,i){e.value=this.parseMethod(n,i),t.body.push(this.finishNode(e,"MethodDefinition"))},H.parseClassId=function(t,e){t.id=this.type===R.name?this.parseIdent():e===!0?this.unexpected():null},H.parseClassSuper=function(t){t.superClass=this.eat(R._extends)?this.parseExprSubscripts():null},H.parseExport=function(t,e){var n=this;if(this.next(),this.eat(R.star))return this.expectContextual("from"),t.source=this.type===R.string?this.parseExprAtom():this.unexpected(),this.semicolon(),this.finishNode(t,"ExportAllDeclaration");if(this.eat(R._default)){this.checkExport(e,"default",this.lastTokStart);var i;if(this.type===R._function||(i=this.isAsyncFunction())){var r=this.startNode();this.next(),i&&this.next(),t.declaration=this.parseFunction(r,"nullableID",!1,i)}else if(this.type===R._class){var s=this.startNode();t.declaration=this.parseClass(s,"nullableID")}else t.declaration=this.parseMaybeAssign(),this.semicolon();return this.finishNode(t,"ExportDefaultDeclaration")}if(this.shouldParseExportStatement())t.declaration=this.parseStatement(!0),"VariableDeclaration"===t.declaration.type?this.checkVariableExport(e,t.declaration.declarations):this.checkExport(e,t.declaration.id.name,t.declaration.id.start),t.specifiers=[],t.source=null;else{if(t.declaration=null,t.specifiers=this.parseExportSpecifiers(e),this.eatContextual("from"))t.source=this.type===R.string?this.parseExprAtom():this.unexpected();else{for(var a=0,o=t.specifiers;a=6&&t)switch(t.type){case"Identifier":this.inAsync&&"await"===t.name&&this.raise(t.start,"Can not use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":break;case"ObjectExpression":t.type="ObjectPattern";for(var i=0,r=t.properties;i=6&&(t.computed||t.method||t.shorthand))){var n,i=t.key;switch(i.type){case"Identifier":n=i.name;break;case"Literal":n=String(i.value);break;default:return}var r=t.kind;if(this.options.ecmaVersion>=6)return void("__proto__"===n&&"init"===r&&(e.proto&&this.raiseRecoverable(i.start,"Redefinition of __proto__ property"),e.proto=!0));n="$"+n;var s=e[n];if(s){var a;a="init"===r?this.strict&&s.init||s.get||s.set:s.init||s[r],a&&this.raiseRecoverable(i.start,"Redefinition of property")}else s=e[n]={init:!1,get:!1,set:!1};s[r]=!0}},tt.parseExpression=function(t,e){var n=this,i=this.start,r=this.startLoc,s=this.parseMaybeAssign(t,e);if(this.type===R.comma){var a=this.startNodeAt(i,r);for(a.expressions=[s];this.eat(R.comma);)a.expressions.push(n.parseMaybeAssign(t,e));return this.finishNode(a,"SequenceExpression")}return s},tt.parseMaybeAssign=function(t,e,n){if(this.inGenerator&&this.isContextual("yield"))return this.parseYield();var i=!1,r=-1,s=-1;e?(r=e.parenthesizedAssign,s=e.trailingComma,e.parenthesizedAssign=e.trailingComma=-1):(e=new p,i=!0);var a=this.start,o=this.startLoc;this.type!=R.parenL&&this.type!=R.name||(this.potentialArrowAt=this.start);var u=this.parseMaybeConditional(t,e);if(n&&(u=n.call(this,u,a,o)),this.type.isAssign){this.checkPatternErrors(e,!0),i||p.call(e);var h=this.startNodeAt(a,o);return h.operator=this.value,h.left=this.type===R.eq?this.toAssignable(u):u,e.shorthandAssign=-1,this.checkLVal(u),this.next(),h.right=this.parseMaybeAssign(t),this.finishNode(h,"AssignmentExpression")}return i&&this.checkExpressionErrors(e,!0),r>-1&&(e.parenthesizedAssign=r),s>-1&&(e.trailingComma=s),u},tt.parseMaybeConditional=function(t,e){var n=this.start,i=this.startLoc,r=this.parseExprOps(t,e);if(this.checkExpressionErrors(e))return r;if(this.eat(R.question)){var s=this.startNodeAt(n,i);return s.test=r,s.consequent=this.parseMaybeAssign(),this.expect(R.colon),s.alternate=this.parseMaybeAssign(t),this.finishNode(s,"ConditionalExpression")}return r},tt.parseExprOps=function(t,e){var n=this.start,i=this.startLoc,r=this.parseMaybeUnary(e,!1);return this.checkExpressionErrors(e)?r:r.start==n&&"ArrowFunctionExpression"===r.type?r:this.parseExprOp(r,n,i,-1,t)},tt.parseExprOp=function(t,e,n,i,r){var s=this.type.binop;if(null!=s&&(!r||this.type!==R._in)&&s>i){var a=this.type===R.logicalOR||this.type===R.logicalAND,o=this.value;this.next();var u=this.start,h=this.startLoc,l=this.parseExprOp(this.parseMaybeUnary(null,!1),u,h,s,r),c=this.buildBinary(e,n,t,l,o,a);return this.parseExprOp(c,e,n,i,r)}return t},tt.buildBinary=function(t,e,n,i,r,s){var a=this.startNodeAt(t,e);return a.left=n,a.operator=r,a.right=i,this.finishNode(a,s?"LogicalExpression":"BinaryExpression")},tt.parseMaybeUnary=function(t,e){var n,i=this,r=this.start,s=this.startLoc;if(this.inAsync&&this.isContextual("await"))n=this.parseAwait(t),e=!0;else if(this.type.prefix){var a=this.startNode(),o=this.type===R.incDec;a.operator=this.value,a.prefix=!0,this.next(),a.argument=this.parseMaybeUnary(null,!0),this.checkExpressionErrors(t,!0),o?this.checkLVal(a.argument):this.strict&&"delete"===a.operator&&"Identifier"===a.argument.type?this.raiseRecoverable(a.start,"Deleting local variable in strict mode"):e=!0,n=this.finishNode(a,o?"UpdateExpression":"UnaryExpression")}else{if(n=this.parseExprSubscripts(t),this.checkExpressionErrors(t))return n;for(;this.type.postfix&&!this.canInsertSemicolon();){var u=i.startNodeAt(r,s);u.operator=i.value,u.prefix=!1,u.argument=n,i.checkLVal(n),i.next(),n=i.finishNode(u,"UpdateExpression")}}return!e&&this.eat(R.starstar)?this.buildBinary(r,s,n,this.parseMaybeUnary(null,!1),"**",!1):n},tt.parseExprSubscripts=function(t){var e=this.start,n=this.startLoc,i=this.parseExprAtom(t),r="ArrowFunctionExpression"===i.type&&")"!==this.input.slice(this.lastTokStart,this.lastTokEnd);if(this.checkExpressionErrors(t)||r)return i;var s=this.parseSubscripts(i,e,n);return t&&"MemberExpression"===s.type&&(t.parenthesizedAssign>=s.start&&(t.parenthesizedAssign=-1),t.parenthesizedBind>=s.start&&(t.parenthesizedBind=-1)),s},tt.parseSubscripts=function(t,e,n,i){for(var r=this,s=this.options.ecmaVersion>=8&&"Identifier"===t.type&&"async"===t.name&&this.lastTokEnd==t.end&&!this.canInsertSemicolon(),a=void 0;;)if((a=r.eat(R.bracketL))||r.eat(R.dot)){var o=r.startNodeAt(e,n);o.object=t,o.property=a?r.parseExpression():r.parseIdent(!0),o.computed=!!a,a&&r.expect(R.bracketR),t=r.finishNode(o,"MemberExpression")}else if(!i&&r.eat(R.parenL)){var u=new p,h=r.yieldPos,l=r.awaitPos;r.yieldPos=0,r.awaitPos=0;var c=r.parseExprList(R.parenR,r.options.ecmaVersion>=8,!1,u);if(s&&!r.canInsertSemicolon()&&r.eat(R.arrow))return r.checkPatternErrors(u,!1),r.checkYieldAwaitInDefaultParams(),r.yieldPos=h,r.awaitPos=l,r.parseArrowExpression(r.startNodeAt(e,n),c,!0);r.checkExpressionErrors(u,!0),r.yieldPos=h||r.yieldPos,r.awaitPos=l||r.awaitPos;var f=r.startNodeAt(e,n);f.callee=t,f.arguments=c,t=r.finishNode(f,"CallExpression")}else{if(r.type!==R.backQuote)return t;var d=r.startNodeAt(e,n);d.tag=t,d.quasi=r.parseTemplate({isTagged:!0}),t=r.finishNode(d,"TaggedTemplateExpression")}},tt.parseExprAtom=function(t){var e,n=this.potentialArrowAt==this.start;switch(this.type){case R._super:this.inFunction||this.raise(this.start,"'super' outside of function or class");case R._this:var i=this.type===R._this?"ThisExpression":"Super";return e=this.startNode(),this.next(),this.finishNode(e,i);case R.name:var r=this.start,s=this.startLoc,a=this.parseIdent(this.type!==R.name);if(this.options.ecmaVersion>=8&&"async"===a.name&&!this.canInsertSemicolon()&&this.eat(R._function))return this.parseFunction(this.startNodeAt(r,s),!1,!1,!0);if(n&&!this.canInsertSemicolon()){if(this.eat(R.arrow))return this.parseArrowExpression(this.startNodeAt(r,s),[a],!1);if(this.options.ecmaVersion>=8&&"async"===a.name&&this.type===R.name)return a=this.parseIdent(),!this.canInsertSemicolon()&&this.eat(R.arrow)||this.unexpected(),this.parseArrowExpression(this.startNodeAt(r,s),[a],!0)}return a;case R.regexp:var o=this.value;return e=this.parseLiteral(o.value),e.regex={pattern:o.pattern,flags:o.flags},e;case R.num:case R.string:return this.parseLiteral(this.value);case R._null:case R._true:case R._false:return e=this.startNode(),e.value=this.type===R._null?null:this.type===R._true,e.raw=this.type.keyword,this.next(),this.finishNode(e,"Literal");case R.parenL:var u=this.start,h=this.parseParenAndDistinguishExpression(n);return t&&(t.parenthesizedAssign<0&&!this.isSimpleAssignTarget(h)&&(t.parenthesizedAssign=u),t.parenthesizedBind<0&&(t.parenthesizedBind=u)),h;case R.bracketL:return e=this.startNode(),this.next(),e.elements=this.parseExprList(R.bracketR,!0,!0,t),this.finishNode(e,"ArrayExpression");case R.braceL:return this.parseObj(!1,t);case R._function:return e=this.startNode(),this.next(),this.parseFunction(e,!1);case R._class:return this.parseClass(this.startNode(),!1);case R._new:return this.parseNew();case R.backQuote:return this.parseTemplate();default:this.unexpected()}},tt.parseLiteral=function(t){var e=this.startNode();return e.value=t,e.raw=this.input.slice(this.start,this.end),this.next(),this.finishNode(e,"Literal")},tt.parseParenExpression=function(){this.expect(R.parenL);var t=this.parseExpression();return this.expect(R.parenR),t},tt.parseParenAndDistinguishExpression=function(t){var e,n=this,i=this.start,r=this.startLoc,s=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var a,o,u=this.start,h=this.startLoc,l=[],c=!0,f=!1,d=new p,m=this.yieldPos,g=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==R.parenR;){if(c?c=!1:n.expect(R.comma),s&&n.afterTrailingComma(R.parenR,!0)){f=!0;break}if(n.type===R.ellipsis){a=n.start,l.push(n.parseParenItem(n.parseRestBinding())),n.type===R.comma&&n.raise(n.start,"Comma is not permitted after the rest element");break}n.type!==R.parenL||o||(o=n.start),l.push(n.parseMaybeAssign(!1,d,n.parseParenItem))}var y=this.start,b=this.startLoc;if(this.expect(R.parenR),t&&!this.canInsertSemicolon()&&this.eat(R.arrow))return this.checkPatternErrors(d,!1),this.checkYieldAwaitInDefaultParams(),o&&this.unexpected(o),this.yieldPos=m,this.awaitPos=g,this.parseParenArrowList(i,r,l);l.length&&!f||this.unexpected(this.lastTokStart),a&&this.unexpected(a),this.checkExpressionErrors(d,!0),this.yieldPos=m||this.yieldPos,this.awaitPos=g||this.awaitPos,l.length>1?(e=this.startNodeAt(u,h),e.expressions=l,this.finishNodeAt(e,"SequenceExpression",y,b)):e=l[0]}else e=this.parseParenExpression();if(this.options.preserveParens){var v=this.startNodeAt(i,r);return v.expression=e,this.finishNode(v,"ParenthesizedExpression")}return e},tt.parseParenItem=function(t){return t},tt.parseParenArrowList=function(t,e,n){return this.parseArrowExpression(this.startNodeAt(t,e),n)};var et=[];tt.parseNew=function(){var t=this.startNode(),e=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(R.dot))return t.meta=e,t.property=this.parseIdent(!0),"target"!==t.property.name&&this.raiseRecoverable(t.property.start,"The only valid meta property for new is new.target"),this.inFunction||this.raiseRecoverable(t.start,"new.target can only be used in functions"),this.finishNode(t,"MetaProperty");var n=this.start,i=this.startLoc;return t.callee=this.parseSubscripts(this.parseExprAtom(),n,i,!0),this.eat(R.parenL)?t.arguments=this.parseExprList(R.parenR,this.options.ecmaVersion>=8,!1):t.arguments=et,this.finishNode(t,"NewExpression")},tt.parseTemplateElement=function(t){var e=t.isTagged,n=this.startNode();return this.type===R.invalidTemplate?(e||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),n.value={raw:this.value,cooked:null}):n.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),n.tail=this.type===R.backQuote,this.finishNode(n,"TemplateElement")},tt.parseTemplate=function(t){var e=this;void 0===t&&(t={});var n=t.isTagged;void 0===n&&(n=!1);var i=this.startNode();this.next(),i.expressions=[];var r=this.parseTemplateElement({isTagged:n});for(i.quasis=[r];!r.tail;)e.expect(R.dollarBraceL),i.expressions.push(e.parseExpression()),e.expect(R.braceR),i.quasis.push(r=e.parseTemplateElement({isTagged:n}));return this.next(),this.finishNode(i,"TemplateLiteral")},tt.isAsyncProp=function(t){return!(t.computed||"Identifier"!==t.key.type||"async"!==t.key.name||this.type!==R.name&&this.type!==R.num&&this.type!==R.string&&this.type!==R.bracketL||L.test(this.input.slice(this.lastTokEnd,this.start)))},tt.parseObj=function(t,e){var n=this,i=this.startNode(),r=!0,s={};for(i.properties=[],this.next();!this.eat(R.braceR);){if(r)r=!1;else if(n.expect(R.comma),n.afterTrailingComma(R.braceR))break;var a=n.startNode(),o=void 0,u=void 0,h=void 0,l=void 0;n.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(t||e)&&(h=n.start,l=n.startLoc),t||(o=n.eat(R.star))),n.parsePropertyName(a),!t&&n.options.ecmaVersion>=8&&!o&&n.isAsyncProp(a)?(u=!0,n.parsePropertyName(a,e)):u=!1,n.parsePropertyValue(a,t,o,u,h,l,e),n.checkPropClash(a,s),i.properties.push(n.finishNode(a,"Property"))}return this.finishNode(i,t?"ObjectPattern":"ObjectExpression")},tt.parsePropertyValue=function(t,e,n,i,r,s,a){if((n||i)&&this.type===R.colon&&this.unexpected(),this.eat(R.colon))t.value=e?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),t.kind="init";else if(this.options.ecmaVersion>=6&&this.type===R.parenL)e&&this.unexpected(),t.kind="init",t.method=!0,t.value=this.parseMethod(n,i);else if(this.options.ecmaVersion>=5&&!t.computed&&"Identifier"===t.key.type&&("get"===t.key.name||"set"===t.key.name)&&this.type!=R.comma&&this.type!=R.braceR){(n||i||e)&&this.unexpected(),t.kind=t.key.name,this.parsePropertyName(t),t.value=this.parseMethod(!1);var o="get"===t.kind?0:1;if(t.value.params.length!==o){var u=t.value.start;"get"===t.kind?this.raiseRecoverable(u,"getter should have no params"):this.raiseRecoverable(u,"setter should have exactly one param")}else"set"===t.kind&&"RestElement"===t.value.params[0].type&&this.raiseRecoverable(t.value.params[0].start,"Setter cannot use rest params")}else this.options.ecmaVersion>=6&&!t.computed&&"Identifier"===t.key.type?(this.checkUnreserved(t.key),t.kind="init",e?t.value=this.parseMaybeDefault(r,s,t.key):this.type===R.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),t.value=this.parseMaybeDefault(r,s,t.key)):t.value=t.key,t.shorthand=!0):this.unexpected()},tt.parsePropertyName=function(t){if(this.options.ecmaVersion>=6){if(this.eat(R.bracketL))return t.computed=!0,t.key=this.parseMaybeAssign(),this.expect(R.bracketR),t.key;t.computed=!1}return t.key=this.type===R.num||this.type===R.string?this.parseExprAtom():this.parseIdent(!0)},tt.initFunction=function(t){t.id=null,this.options.ecmaVersion>=6&&(t.generator=!1,t.expression=!1),this.options.ecmaVersion>=8&&(t.async=!1)},tt.parseMethod=function(t,e){var n=this.startNode(),i=this.inGenerator,r=this.inAsync,s=this.yieldPos,a=this.awaitPos,o=this.inFunction;return this.initFunction(n),this.options.ecmaVersion>=6&&(n.generator=t),this.options.ecmaVersion>=8&&(n.async=!!e),this.inGenerator=n.generator,this.inAsync=n.async,this.yieldPos=0,this.awaitPos=0,this.inFunction=!0,this.enterFunctionScope(),this.expect(R.parenL),n.params=this.parseBindingList(R.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(n,!1),this.inGenerator=i,this.inAsync=r,this.yieldPos=s,this.awaitPos=a,this.inFunction=o,this.finishNode(n,"FunctionExpression")},tt.parseArrowExpression=function(t,e,n){var i=this.inGenerator,r=this.inAsync,s=this.yieldPos,a=this.awaitPos,o=this.inFunction;return this.enterFunctionScope(),this.initFunction(t),this.options.ecmaVersion>=8&&(t.async=!!n),this.inGenerator=!1,this.inAsync=t.async,this.yieldPos=0,this.awaitPos=0,this.inFunction=!0,t.params=this.toAssignableList(e,!0),this.parseFunctionBody(t,!0),this.inGenerator=i,this.inAsync=r,this.yieldPos=s,this.awaitPos=a,this.inFunction=o,this.finishNode(t,"ArrowFunctionExpression")},tt.parseFunctionBody=function(t,e){var n=e&&this.type!==R.braceL,i=this.strict,r=!1;if(n)t.body=this.parseMaybeAssign(),t.expression=!0,this.checkParams(t,!1);else{var s=this.options.ecmaVersion>=7&&!this.isSimpleParamList(t.params);i&&!s||(r=this.strictDirective(this.end),r&&s&&this.raiseRecoverable(t.start,"Illegal 'use strict' directive in function with non-simple parameter list"));var a=this.labels;this.labels=[],r&&(this.strict=!0),this.checkParams(t,!i&&!r&&!e&&this.isSimpleParamList(t.params)),t.body=this.parseBlock(!1),t.expression=!1,this.labels=a}this.exitFunctionScope(),this.strict&&t.id&&this.checkLVal(t.id,"none"),this.strict=i},tt.isSimpleParamList=function(t){for(var e=0,n=t;e0;)e[n]=arguments[n+1];for(var i=0,r=e;i=1;e--){var n=t.context[e];if("function"===n.token)return n.generator}return!1},ht.updateContext=function(t){var e,n=this.type;n.keyword&&t==R.dot?this.exprAllowed=!1:(e=n.updateContext)?e.call(this,t):this.exprAllowed=n.beforeExpr},R.parenR.updateContext=R.braceR.updateContext=function(){if(1==this.context.length)return void(this.exprAllowed=!0);var t=this.context.pop();t===ut.b_stat&&"function"===this.curContext().token&&(t=this.context.pop()),this.exprAllowed=!t.isExpr},R.braceL.updateContext=function(t){this.context.push(this.braceIsBlock(t)?ut.b_stat:ut.b_expr),this.exprAllowed=!0},R.dollarBraceL.updateContext=function(){this.context.push(ut.b_tmpl),this.exprAllowed=!0},R.parenL.updateContext=function(t){var e=t===R._if||t===R._for||t===R._with||t===R._while;this.context.push(e?ut.p_stat:ut.p_expr),this.exprAllowed=!0},R.incDec.updateContext=function(){},R._function.updateContext=R._class.updateContext=function(t){t.beforeExpr&&t!==R.semi&&t!==R._else&&(t!==R.colon&&t!==R.braceL||this.curContext()!==ut.b_stat)?this.context.push(ut.f_expr):this.context.push(ut.f_stat),this.exprAllowed=!1},R.backQuote.updateContext=function(){this.curContext()===ut.q_tmpl?this.context.pop():this.context.push(ut.q_tmpl),this.exprAllowed=!1},R.star.updateContext=function(t){if(t==R._function){var e=this.context.length-1;this.context[e]===ut.f_expr?this.context[e]=ut.f_expr_gen:this.context[e]=ut.f_gen}this.exprAllowed=!0},R.name.updateContext=function(t){var e=!1;this.options.ecmaVersion>=6&&("of"==this.value&&!this.exprAllowed||"yield"==this.value&&this.inGeneratorContext())&&(e=!0),this.exprAllowed=e};var lt=function(t){this.type=t.type,this.value=t.value,this.start=t.start,this.end=t.end,t.options.locations&&(this.loc=new K(t,t.startLoc,t.endLoc)),t.options.ranges&&(this.range=[t.start,t.end])},ct=X.prototype,pt="object"==typeof Packages&&"[object JavaPackage]"==Object.prototype.toString.call(Packages);ct.next=function(){this.options.onToken&&this.options.onToken(new lt(this)),this.lastTokEnd=this.end,this.lastTokStart=this.start,this.lastTokEndLoc=this.endLoc,this.lastTokStartLoc=this.startLoc,this.nextToken()},ct.getToken=function(){return this.next(),new lt(this)},"undefined"!=typeof Symbol&&(ct[Symbol.iterator]=function(){var t=this;return{next:function(){var e=t.getToken();return{done:e.type===R.eof,value:e}}}}),ct.curContext=function(){return this.context[this.context.length-1]},ct.nextToken=function(){var t=this.curContext();return t&&t.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(R.eof):t.override?t.override(this):void this.readToken(this.fullCharCodeAtPos())},ct.readToken=function(t){return n(t,this.options.ecmaVersion>=6)||92===t?this.readWord():this.getTokenFromCode(t)},ct.fullCharCodeAtPos=function(){var t=this.input.charCodeAt(this.pos);if(t<=55295||t>=57344)return t;var e=this.input.charCodeAt(this.pos+1);return(t<<10)+e-56613888},ct.skipBlockComment=function(){var t=this,e=this.options.onComment&&this.curPosition(),n=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(i===-1&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations){D.lastIndex=n;for(var r;(r=D.exec(this.input))&&r.index8&&e<14||e>=5760&&I.test(String.fromCharCode(e))))break t;++t.pos}}},ct.finishToken=function(t,e){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var n=this.type;this.type=t,this.value=e,this.updateContext(n)},ct.readToken_dot=function(){var t=this.input.charCodeAt(this.pos+1);if(t>=48&&t<=57)return this.readNumber(!0);var e=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===t&&46===e?(this.pos+=3,this.finishToken(R.ellipsis)):(++this.pos,this.finishToken(R.dot))},ct.readToken_slash=function(){var t=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===t?this.finishOp(R.assign,2):this.finishOp(R.slash,1)},ct.readToken_mult_modulo_exp=function(t){var e=this.input.charCodeAt(this.pos+1),n=1,i=42===t?R.star:R.modulo;return this.options.ecmaVersion>=7&&42===e&&(++n,i=R.starstar,e=this.input.charCodeAt(this.pos+2)),61===e?this.finishOp(R.assign,n+1):this.finishOp(i,n)},ct.readToken_pipe_amp=function(t){var e=this.input.charCodeAt(this.pos+1);return e===t?this.finishOp(124===t?R.logicalOR:R.logicalAND,2):61===e?this.finishOp(R.assign,2):this.finishOp(124===t?R.bitwiseOR:R.bitwiseAND,1)},ct.readToken_caret=function(){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(R.assign,2):this.finishOp(R.bitwiseXOR,1)},ct.readToken_plus_min=function(t){var e=this.input.charCodeAt(this.pos+1);return e===t?45!=e||62!=this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!L.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(R.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===e?this.finishOp(R.assign,2):this.finishOp(R.plusMin,1)},ct.readToken_lt_gt=function(t){var e=this.input.charCodeAt(this.pos+1),n=1;return e===t?(n=62===t&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+n)?this.finishOp(R.assign,n+1):this.finishOp(R.bitShift,n)):33==e&&60==t&&45==this.input.charCodeAt(this.pos+2)&&45==this.input.charCodeAt(this.pos+3)?(this.inModule&&this.unexpected(),this.skipLineComment(4),this.skipSpace(),this.nextToken()):(61===e&&(n=2),this.finishOp(R.relational,n))},ct.readToken_eq_excl=function(t){var e=this.input.charCodeAt(this.pos+1);return 61===e?this.finishOp(R.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===t&&62===e&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(R.arrow)):this.finishOp(61===t?R.eq:R.prefix,1)},ct.getTokenFromCode=function(t){switch(t){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(R.parenL);case 41:return++this.pos,this.finishToken(R.parenR);case 59:return++this.pos,this.finishToken(R.semi);case 44:return++this.pos,this.finishToken(R.comma);case 91:return++this.pos,this.finishToken(R.bracketL);case 93:return++this.pos,this.finishToken(R.bracketR);case 123:return++this.pos,this.finishToken(R.braceL);case 125:return++this.pos,this.finishToken(R.braceR);case 58:return++this.pos,this.finishToken(R.colon);case 63:return++this.pos,this.finishToken(R.question);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(R.backQuote);case 48:var e=this.input.charCodeAt(this.pos+1);if(120===e||88===e)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===e||79===e)return this.readRadixNumber(8);if(98===e||66===e)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(t);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(t);case 124:case 38:return this.readToken_pipe_amp(t);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(t);case 60:case 62:return this.readToken_lt_gt(t);case 61:case 33:return this.readToken_eq_excl(t);case 126:return this.finishOp(R.prefix,1)}this.raise(this.pos,"Unexpected character '"+m(t)+"'")},ct.finishOp=function(t,e){var n=this.input.slice(this.pos,this.pos+e);return this.pos+=e,this.finishToken(t,n)};var ft=!!d("￿","u");ct.readRegexp=function(){for(var t,e,n=this,i=this.pos;;){n.pos>=n.input.length&&n.raise(i,"Unterminated regular expression");var r=n.input.charAt(n.pos);if(L.test(r)&&n.raise(i,"Unterminated regular expression"),t)t=!1;else{if("["===r)e=!0;else if("]"===r&&e)e=!1;else if("/"===r&&!e)break;t="\\"===r}++n.pos}var s=this.input.slice(i,this.pos);++this.pos;var a=this.readWord1(),o=s,u="";if(a){var h=/^[gim]*$/;this.options.ecmaVersion>=6&&(h=/^[gimuy]*$/),h.test(a)||this.raise(i,"Invalid regular expression flag"),a.indexOf("u")>=0&&(ft?u="u":(o=o.replace(/\\u\{([0-9a-fA-F]+)\}/g,function(t,e,r){return e=Number("0x"+e),e>1114111&&n.raise(i+r+3,"Code point out of bounds"),"x"}),o=o.replace(/\\u([a-fA-F0-9]{4})|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"x"),u=u.replace("u","")))}var l=null;return pt||(d(o,u,i,this),l=d(s,a)),this.finishToken(R.regexp,{pattern:s,flags:a,value:l})},ct.readInt=function(t,e){for(var n=this,i=this.pos,r=0,s=0,a=null==e?1/0:e;s=97?o-97+10:o>=65?o-65+10:o>=48&&o<=57?o-48:1/0,u>=t)break;++n.pos,r=r*t+u}return this.pos===i||null!=e&&this.pos-i!==e?null:r},ct.readRadixNumber=function(t){this.pos+=2;var e=this.readInt(t);return null==e&&this.raise(this.start+2,"Expected number in radix "+t),n(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(R.num,e)},ct.readNumber=function(t){var e=this.pos,i=!1,r=48===this.input.charCodeAt(this.pos);t||null!==this.readInt(10)||this.raise(e,"Invalid number"),r&&this.pos==e+1&&(r=!1);var s=this.input.charCodeAt(this.pos);46!==s||r||(++this.pos,this.readInt(10),i=!0,s=this.input.charCodeAt(this.pos)),69!==s&&101!==s||r||(s=this.input.charCodeAt(++this.pos),43!==s&&45!==s||++this.pos,null===this.readInt(10)&&this.raise(e,"Invalid number"),i=!0),n(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var a,o=this.input.slice(e,this.pos);return i?a=parseFloat(o):r&&1!==o.length?this.strict?this.raise(e,"Invalid number"):a=/[89]/.test(o)?parseInt(o,10):parseInt(o,8):a=parseInt(o,10),this.finishToken(R.num,a)},ct.readCodePoint=function(){var t,e=this.input.charCodeAt(this.pos);if(123===e){this.options.ecmaVersion<6&&this.unexpected();var n=++this.pos;t=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,t>1114111&&this.invalidStringToken(n,"Code point out of bounds")}else t=this.readHexChar(4);return t},ct.readString=function(t){for(var e=this,n="",i=++this.pos;;){e.pos>=e.input.length&&e.raise(e.start,"Unterminated string constant");var r=e.input.charCodeAt(e.pos);if(r===t)break;92===r?(n+=e.input.slice(i,e.pos),n+=e.readEscapedChar(!1),i=e.pos):(a(r)&&e.raise(e.start,"Unterminated string constant"),++e.pos)}return n+=this.input.slice(i,this.pos++),this.finishToken(R.string,n)};var dt={};ct.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(t){if(t!==dt)throw t;this.readInvalidTemplateToken()}this.inTemplateElement=!1},ct.invalidStringToken=function(t,e){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw dt;this.raise(t,e)},ct.readTmplToken=function(){for(var t=this,e="",n=this.pos;;){t.pos>=t.input.length&&t.raise(t.start,"Unterminated template");var i=t.input.charCodeAt(t.pos);if(96===i||36===i&&123===t.input.charCodeAt(t.pos+1))return t.pos!==t.start||t.type!==R.template&&t.type!==R.invalidTemplate?(e+=t.input.slice(n,t.pos),t.finishToken(R.template,e)):36===i?(t.pos+=2,t.finishToken(R.dollarBraceL)):(++t.pos,t.finishToken(R.backQuote));if(92===i)e+=t.input.slice(n,t.pos),e+=t.readEscapedChar(!0),n=t.pos;else if(a(i)){switch(e+=t.input.slice(n,t.pos),++t.pos,i){case 13:10===t.input.charCodeAt(t.pos)&&++t.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(i)}t.options.locations&&(++t.curLine,t.lineStart=t.pos),n=t.pos}else++t.pos}},ct.readInvalidTemplateToken=function(){for(var t=this;this.pos=48&&e<=55){var n=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],i=parseInt(n,8);return i>255&&(n=n.slice(0,-1),i=parseInt(n,8)),"0"!==n&&(this.strict||t)&&this.invalidStringToken(this.pos-2,"Octal literal in strict mode"),this.pos+=n.length-1,String.fromCharCode(i)}return String.fromCharCode(e)}},ct.readHexChar=function(t){var e=this.pos,n=this.readInt(16,t);return null===n&&this.invalidStringToken(e,"Bad character escape sequence"),n},ct.readWord1=function(){var t=this;this.containsEsc=!1;for(var e="",r=!0,s=this.pos,a=this.options.ecmaVersion>=6;this.pos + + + + + From 21c9f50de7a5b5d56743fd1525ad6739ac4f6325 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 11 Aug 2017 16:08:49 -0400 Subject: [PATCH 079/120] adjusted the way pixels are drawn to make them align with the edge of the map. changed "density" to "pixelsize". new election15 just to show yee diagrams --- play/election15.html | 28 ++++++++++++++++++++++++++++ play/js/Model.js | 26 +++++++++++++------------- play/js/Presets.js | 23 +++++++++++++++++++++++ 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 play/election15.html diff --git a/play/election15.html b/play/election15.html new file mode 100644 index 00000000..ced708ab --- /dev/null +++ b/play/election15.html @@ -0,0 +1,28 @@ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/play/js/Model.js b/play/js/Model.js index 4d77eb1e..c907e0d3 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -88,8 +88,8 @@ function Model(config){ self.onUpdate = function(){}; // TO IMPLEMENT self.calculateYee = function(){ - self.density= 30.0; - var density = self.density; + self.pixelsize= 30.0; + var pixelsize = self.pixelsize; WIDTH = ctx.canvas.width; HEIGHT = ctx.canvas.height; doArrayWay = true @@ -152,7 +152,7 @@ function Model(config){ lv = xv.length lc = xc.length - self.fastyeesettings = [lc,lv,WIDTH,HEIGHT,density] + self.fastyeesettings = [lc,lv,WIDTH,HEIGHT,pixelsize] function arraysEqual(arr1, arr2) { arr1 = arr1 || [0] arr2 = arr2 || [0] @@ -169,7 +169,7 @@ function Model(config){ //(self.fastyeesettings || 0) != (self.oldfastyeesettings || 0)) self.oldfastyeesettings = self.fastyeesettings if (recompileyee) { - fastyee = createKernelYee(lc,lv,WIDTH,HEIGHT,density) + fastyee = createKernelYee(lc,lv,WIDTH,HEIGHT,pixelsize) } winners = fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) @@ -182,8 +182,8 @@ function Model(config){ saveo.x = self.yeeobject.x; saveo.y = self.yeeobject.y; var i=0 - for(var x=0.0, cx=0; x<=WIDTH; x+= density, cx++) { - for(var y=0.0, cy=0; y<=HEIGHT; y+= density, cy++) { + for(var x=.5*pixelsize, cx=0; x<=WIDTH; x+= pixelsize, cx++) { + for(var y=.5*pixelsize, cy=0; y<=HEIGHT; y+= pixelsize, cy++) { if (doArrayWay) { var a = Candidate.graphics[canAid[Math.round(winners[i])]].fill if (a == "#ccc") {a = "#ddd"} // hack for now, but will deal with ties later @@ -235,23 +235,23 @@ function Model(config){ if(self.yeeon){ ctx.globalAlpha = .9 - var density = self.density; + var pixelsize = self.pixelsize; for(var k=0;k Date: Fri, 11 Aug 2017 19:18:31 -0400 Subject: [PATCH 080/120] kinda works. but gets the math wrong. also, works differently on different browsers. mobile chrome v mobile firefox --- play/js/FastYee.js | 91 ++++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/play/js/FastYee.js b/play/js/FastYee.js index de317af0..7ed04aa8 100644 --- a/play/js/FastYee.js +++ b/play/js/FastYee.js @@ -26,8 +26,8 @@ function createKernelYee(lc,lv,WIDTH,HEIGHT,density) { runscript = false -var onlylast = true -docubevc = true +var onlylast = false +//docubevc = true var li,lv,lc @@ -60,9 +60,11 @@ right.innerHTML += 'left is gpu output. right is true values.' // make variables -var lc = 5 -var lv = 2 -var li = 10 // 400 +// comment these out since we get them fron the function +// var lc = 5 +// var lv = 2 +// var li = 10 // 400 + var xf = [] for (i =0;i") cube2 = d(xv, yv, xf, yf) } + const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { return findWinner(doTally(doScores(cube2,maxCube(cube2),minCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),5,0))) }) + +// const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xf,yf){ +// return superKernel2(d(xv,yv,xf,yf)) +// }) +// can't do this kind of nesting if(runscript){ @@ -649,32 +661,32 @@ right.innerHTML += "
"+"done" } -// const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { -// var cube,min,max,fnorm,scores,tally,winner -// cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) -// min = minCube(cube) -// max = maxCube(cube) -// fnorm = doFnorm(max,min) -// scores = doScores(cube,max,min,fnorm,5,0) +const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { + // var cube,min,max,fnorm,scores,tally,winner + cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) -// tally = doTally(scores) -// winner = findWinner(tally) -// return winner -// }) + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) -// const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { -// var cube,min,max,fnorm,scores,tally,winner -// cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) -// min = minCube(cube) -// max = maxCube(cube) -// fnorm = doFnorm(max,min) -// scores = doScores(cube,max,min,fnorm,5,0) +const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { + //var cube,min,max,fnorm,scores,tally,winner + cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + min = minCube(cube) + max = maxCube(cube) + fnorm = doFnorm(max,min) + scores = doScores(cube,max,min,fnorm,5,0) -// tally = doTally(scores) -// winner = findWinner(tally) -// return winner -// }) + tally = doTally(scores) + winner = findWinner(tally) + return winner + }) cubeCandidateToWinner = function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ @@ -685,13 +697,19 @@ fnorm3 = doFnorm(max3,min3) scores3 = doScores(cube3,max3,min3,fnorm3,5,0) tally3 = doTally(scores3) -winner3 = findWinner(tally3).slice(0,li); +winner3 = findWinner(tally3) return winner3 } - - +// these two are different because they use nesting instead of variables +// const superKernel3Candidate = gpu.combineKernels(cubeCandidate,superKernel2,function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +// return superKernel2(cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix)) +// }) +// const superKernel3Voter = gpu.combineKernels(cubeVoter,superKernel2,function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +// return superKernel2(cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix)) +// }) +// can't do this kind of nesting cubeVoterToWinner = function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) @@ -701,7 +719,7 @@ fnorm3 = doFnorm(max3,min3) scores3 = doScores(cube3,max3,min3,fnorm3,5,0) tally3 = doTally(scores3) -winner3 = findWinner(tally3).slice(0,li); +winner3 = findWinner(tally3) return winner3 } @@ -711,14 +729,17 @@ return winner3 function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) { + // have not implemented frontrunners yet if (whichtypetomove == "voter"){ votergrouptomove = movethisidx - return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) - // return superKernelCandidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) + // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) + // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) } else if (whichtypetomove == "candidate"){ candidatetomove = movethisidx - return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) - // return superKernelVoter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) + // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).slice(0,li) + // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) } } From 886621cabfbd097acaabb5cc42aff963eae58f25 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 11 Aug 2017 21:01:16 -0400 Subject: [PATCH 081/120] works! cool. there was a math bug %. and there was a switch in arguments with min and max. Also, there was a factor of 2 that might indicate something weird. Basically, writing the code in just javascript allowed me to see where the fixes were. Then I got those into the GPU code chunks that are harder to debug. --- play/js/FastYee.js | 176 ++++++++++++++++++++++++++++++++++----------- play/js/Model.js | 16 ++--- 2 files changed, 141 insertions(+), 51 deletions(-) diff --git a/play/js/FastYee.js b/play/js/FastYee.js index 7ed04aa8..290478f1 100644 --- a/play/js/FastYee.js +++ b/play/js/FastYee.js @@ -120,7 +120,8 @@ left.innerHTML += "
"+cube.slice(0,100).join("
") right.innerHTML += "
"+"cube" } function dJ(xv,yv,xf,yf,lc,li,lv) { -cube=[] +var cube=[] +var civ,i,v,c,d,dx,dy,ci for (var civ=0; civ> 0 @@ -197,8 +198,8 @@ const cubeVoter = gpu.createKernel( function(xv,yv,xc,yc,xvcenter,yvcenter,vg,vo if (vg[v]==votergrouptomove){ - xnewvcenter = pixelsize * i / liy // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this - ynewvcenter = pixelsize * i % liy + xnewvcenter = pixelsize * (i / liy) // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this + ynewvcenter = pixelsize * (i % liy) // next, shift the center to this new center xnewv = xv[v] + (xnewvcenter - xvcenter[votergrouptomove]) ynewv = yv[v] + (ynewvcenter - yvcenter[votergrouptomove]) @@ -215,6 +216,36 @@ const cubeVoter = gpu.createKernel( function(xv,yv,xc,yc,xvcenter,yvcenter,vg,vo constants: {lv:lv,lc:lc,li:li} }) +cubeVoterJ = function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,c,li,lv){ +var cube = [] +var civ,i,v,c,d,dx,dy,ci,xnewv,ynewv,xnewvcenter,ynewvcenter +for (var civ = 0; civ < li*lv*lc ; civ++) { + + v = Math.floor(civ / (lc*li)) + ci = civ - v * lc * li + i = Math.floor((ci) / lc) + c = ci % lc; // x + + + if (vg[v]==votergrouptomove){ + xnewvcenter = pixelsize * (i / liy) // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this + ynewvcenter = pixelsize * (i % liy) + // next, shift the center to this new center + xnewv = xv[v] + (xnewvcenter - xvcenter[votergrouptomove]) + ynewv = yv[v] + (ynewvcenter - yvcenter[votergrouptomove]) + } else { + xnewv = xv[v] + ynewv = yv[v] + } + dx = xc[c] - xnewv + dy = yc[c] - ynewv + d = Math.sqrt(dx*dx + dy*dy) + cube.push(d) +} +return cube +} + + if(runscript){ cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) @@ -249,8 +280,8 @@ const cubeCandidate = gpu.createKernel( function(xv,yv,xc,yc,candidatetomove,pix //xnewc = xc[c] * (1-boolcanmove[c]) + xmoved * boolcanmove[c] if (c==candidatetomove){ - xnewc = pixelsize * i / liy // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this - ynewc = pixelsize * i % liy + xnewc = pixelsize * (i / liy) // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this + ynewc = pixelsize * (i % liy) } else { xnewc = xc[c] ynewc = yc[c] @@ -264,6 +295,33 @@ const cubeCandidate = gpu.createKernel( function(xv,yv,xc,yc,candidatetomove,pix constants: {lv:lv,lc:lc,li:li} }) +cubeCandidateJ = function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) { +var cube = [] +var civ,i,v,c,d,dx,dy,ci,xnewc,ynewc +for (var civ = 0; civ < li*lv*lc ; civ++) { + + v = Math.floor(civ / (lc*li)) + ci = civ - v * lc * li + i = Math.floor((ci) / lc) + c = ci % lc; // x + + //xnewc = xc[c] * (1-boolcanmove[c]) + xmoved * boolcanmove[c] + if (c==candidatetomove){ + xnewc = pixelsize * (i / liy) // rounding is actually done in the gpu.js code, so I don't actually need it here. otherwise I would put a Math.round on this + ynewc = pixelsize * (i % liy) + } else { + xnewc = xc[c] + ynewc = yc[c] + } + dx = xv[v] - xnewc + dy = yv[v] - ynewc + d = Math.sqrt(dx*dx + dy*dy) + + cube.push(d) +} +return cube +} + if(runscript){ cubeC = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) @@ -303,8 +361,9 @@ left.innerHTML += "
"+"min" left.innerHTML += "
"+min.slice(0,100).join("
") right.innerHTML += "
"+"min" } -function minCubeJ(d,lc,li,lv) { -min=[] +function minCubeJ(cube,lc,li,lv) { + var iv,civ,n,d1 +var min=[] for (var iv=0; iv") right.innerHTML += "
"+"max" } -function maxCubeJ(d,lc,li,lv){ -max=[] +function maxCubeJ(cube,lc,li,lv){ + var iv,i,v,dx,dy,civ,n,m,d1 +var max=[] for (var iv=0; iv") right.innerHTML += "
"+"fnorm" } function doFnormJ(min,max,lc,li,lv) { -fnormdone=[] + var fnorm +var fnormdone=[] for (var iv=0; iv") @@ -446,8 +507,9 @@ right.innerHTML += "
"+"scores" maxscore=5 minscore=0 } -function doScoresJ(cube,max,min,fnorm,lc,li,lv) { -scores=[] +function doScoresJ(cube,min,max,fnorm,minscore,maxscore,lc,li,lv) { + var v,i,iv,civ,ci,normit,score +var scores=[] for (var civ=0; civ") right.innerHTML += "
"+"tally" } function doTallyJ(scores,lc,li,lv){ -tally = [] + var ci,sum +var tally = [] for (var ci = 0; ci< lc*li; ci++) { sum = 0 @@ -501,7 +564,7 @@ for (var ci = 0; ci< lc*li; ci++) { sum += scores[civ] } tally.push(sum) - right.innerHTML += "
"+sum + if(runscript) right.innerHTML += "
"+sum } return tally } @@ -536,7 +599,8 @@ left.innerHTML += "
"+winner.join("
") right.innerHTML += "
"+"winner" } function findWinnerJ(tally,lc,li,lv){ -miset=[] + var i,ci,m,t1,mi +var miset=[] for (var i = 0; i < li; i++) { m = -1 mi = -1 @@ -548,7 +612,7 @@ for (var i = 0; i < li; i++) { mi = c } } - right.innerHTML += "
"+mi + if(runscript) right.innerHTML += "
"+mi miset.push(mi) } return miset @@ -563,8 +627,8 @@ const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTall cube = d(xv, yv, xf, yf) min = minCube(cube) max = maxCube(cube) - fnorm = doFnorm(max,min) - scores = doScores(cube,max,min,fnorm,5,0) + fnorm = doFnorm(min,max) + scores = doScores(cube,min,max,fnorm,0,5) tally = doTally(scores) winner = findWinner(tally) @@ -588,7 +652,7 @@ cube2 = d(xv, yv, xf, yf) } const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { - return findWinner(doTally(doScores(cube2,maxCube(cube2),minCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),5,0))) + return findWinner(doTally(doScores(cube2,minCube(cube2),maxCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),0,5))) }) // const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xf,yf){ @@ -611,8 +675,8 @@ function cubeToWinner(xv,yv,xf,yf) { cube3 = d(xv, yv, xf, yf) min3 = minCube(cube3) max3 = maxCube(cube3) -fnorm3 = doFnorm(max3,min3) -scores3 = doScores(cube3,max3,min3,fnorm3,5,0) +fnorm3 = doFnorm(min3,max3) +scores3 = doScores(cube3,min3,max3,fnorm3,0,5) tally3 = doTally(scores3) winner3 = findWinner(tally3).slice(0,li); @@ -637,8 +701,32 @@ function cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) { cube3 = dJ(xv, yv, xf, yf,lc,li,lv) min3 = minCubeJ(cube3,lc,li,lv) max3 = maxCubeJ(cube3,lc,li,lv) -fnorm3 = doFnormJ(max3,min3,lc,li,lv) -scores3 = doScoresJ(cube3,max3,min3,fnorm3,5,0,lc,li,lv) +fnorm3 = doFnormJ(min3,max3,lc,li,lv) +scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) + +tally3 = doTallyJ(scores3,lc,li,lv) +winner3 = findWinnerJ(tally3,lc,li,lv) +return winner3 +} + +function cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) { +cube3 = cubeCandidateJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) +min3 = minCubeJ(cube3,lc,li,lv) +max3 = maxCubeJ(cube3,lc,li,lv) +fnorm3 = doFnormJ(min3,max3,lc,li,lv) +scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) + +tally3 = doTallyJ(scores3,lc,li,lv) +winner3 = findWinnerJ(tally3,lc,li,lv) +return winner3 +} + +function cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) { +cube3 = cubeVoterJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) +min3 = minCubeJ(cube3,lc,li,lv) +max3 = maxCubeJ(cube3,lc,li,lv) +fnorm3 = doFnormJ(min3,max3,lc,li,lv) +scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) tally3 = doTallyJ(scores3,lc,li,lv) winner3 = findWinnerJ(tally3,lc,li,lv) @@ -666,8 +754,8 @@ const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,do cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) min = minCube(cube) max = maxCube(cube) - fnorm = doFnorm(max,min) - scores = doScores(cube,max,min,fnorm,5,0) + fnorm = doFnorm(min,max) + scores = doScores(cube,min,max,fnorm,0,5) tally = doTally(scores) winner = findWinner(tally) @@ -680,8 +768,8 @@ const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,do cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) min = minCube(cube) max = maxCube(cube) - fnorm = doFnorm(max,min) - scores = doScores(cube,max,min,fnorm,5,0) + fnorm = doFnorm(min,max) + scores = doScores(cube,min,max,fnorm,0,5) tally = doTally(scores) winner = findWinner(tally) @@ -690,11 +778,11 @@ const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,do cubeCandidateToWinner = function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ -const cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) +cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) min3 = minCube(cube3) max3 = maxCube(cube3) -fnorm3 = doFnorm(max3,min3) -scores3 = doScores(cube3,max3,min3,fnorm3,5,0) +fnorm3 = doFnorm(min3,max3) +scores3 = doScores(cube3,min3,max3,fnorm3,0,5) tally3 = doTally(scores3) winner3 = findWinner(tally3) @@ -715,8 +803,8 @@ cubeVoterToWinner = function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,p cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) min3 = minCube(cube3) max3 = maxCube(cube3) -fnorm3 = doFnorm(max3,min3) -scores3 = doScores(cube3,max3,min3,fnorm3,5,0) +fnorm3 = doFnorm(min3,max3) +scores3 = doScores(cube3,min3,max3,fnorm3,0,5) tally3 = doTally(scores3) winner3 = findWinner(tally3) @@ -734,12 +822,14 @@ function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetom votergrouptomove = movethisidx // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) return superKernelVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) - // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + // return cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) } else if (whichtypetomove == "candidate"){ candidatetomove = movethisidx // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) return superKernelCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).slice(0,li) - // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + // return cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) } } diff --git a/play/js/Model.js b/play/js/Model.js index c907e0d3..70d82052 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -104,14 +104,14 @@ function Model(config){ canAid.push(can) canA.push(c) revCan[c] = i - xc.push(c.x) - yc.push(c.y) + xc.push(c.x*2) // remember the 2 + yc.push(c.y*2) fillc.push(c.fill) if (model.frontrunnerSet.has(c.id)) { fAid.push(can) fA.push(c) - xf.push(c.x) - yf.push(c.y) + xf.push(c.x*2) + yf.push(c.y*2) fillf.push(c.fill) // maybe don't need } if (self.yeeobject == c){ @@ -130,16 +130,16 @@ function Model(config){ for (vidx in self.voters) { v = self.voters[vidx] av.push(v) - xvcenter.push(v.x) - yvcenter.push(v.y) + xvcenter.push(v.x*2) + yvcenter.push(v.y*2) if (self.yeeobject == v){ movethisidx = i whichtypetomove = "voter" } for (j in v.points) { p = v.points[j] - xv.push(p[0] + v.x) - yv.push(p[1] + v.y) + xv.push((p[0] + v.x)*2) + yv.push((p[1] + v.y)*2) vg.push(i) } i++ From a07e99aec4e6077769bc85cd3db635ccfc471b8e Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 00:12:06 -0400 Subject: [PATCH 082/120] UI: added compute method. also fixed some bugs unrelated to the compute method. --- play/js/FastYee.js | 25 ++++++++++++++-------- play/js/Model.js | 8 +++++-- play/js/main_sandbox.js | 47 ++++++++++++++++++++++++++++++++++------- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/play/js/FastYee.js b/play/js/FastYee.js index 290478f1..ad15d019 100644 --- a/play/js/FastYee.js +++ b/play/js/FastYee.js @@ -816,20 +816,27 @@ return winner3 -function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) { +function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) { // have not implemented frontrunners yet if (whichtypetomove == "voter"){ votergrouptomove = movethisidx - // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - return superKernelVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) - // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - // return cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) + + if (method == "gpu") { + // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) + // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + } else if (method == "js") { + return cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) + } } else if (whichtypetomove == "candidate"){ candidatetomove = movethisidx - // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - return superKernelCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).slice(0,li) - // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - // return cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) + if (method == "gpu") { + // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).slice(0,li) + // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + } else if (method == "js") { + return cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) + } } } diff --git a/play/js/Model.js b/play/js/Model.js index 70d82052..796016f2 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -93,6 +93,7 @@ function Model(config){ WIDTH = ctx.canvas.width; HEIGHT = ctx.canvas.height; doArrayWay = true + var winners if (doArrayWay) { // put candidate information into arrays var canA = [], canAid = [], xc = [], yc = [], fillc = [] , revCan = {} // candidates @@ -171,7 +172,10 @@ function Model(config){ if (recompileyee) { fastyee = createKernelYee(lc,lv,WIDTH,HEIGHT,pixelsize) } - winners = fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove) + //method = "gpu" + //method = "js" + method = self.computeMethod + winners = fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) } self.gridx = []; @@ -185,7 +189,7 @@ function Model(config){ for(var x=.5*pixelsize, cx=0; x<=WIDTH; x+= pixelsize, cx++) { for(var y=.5*pixelsize, cy=0; y<=HEIGHT; y+= pixelsize, cy++) { if (doArrayWay) { - var a = Candidate.graphics[canAid[Math.round(winners[i])]].fill + var a = Candidate.graphics[canAid[Math.round(winners[i])] || "square"].fill if (a == "#ccc") {a = "#ddd"} // hack for now, but will deal with ties later self.gridx.push(x); self.gridy.push(y); diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 41ee9252..0c34751a 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -77,6 +77,11 @@ function main(config){ config.unstrategic = config.unstrategic || "zero strategy. judge on an absolute scale."; config.keyyee = config.keyyee || "off"; + config.computeMethod = config.computeMethod || "js"; + var url = window.location.pathname; + var filename = url.substring(url.lastIndexOf('/')+1); + config.filename = filename + config.presethtmlname = filename; config.afrontrunnerArray = Array.from(config.frontrunnerSet)// stringify a set is not good initialConfig = JSON.parse(JSON.stringify(config)); @@ -103,6 +108,7 @@ function main(config){ model.numOfVoters = config.voters; model.system = config.system; model.frontrunnerSet = config.frontrunnerSet; + model.computeMethod = config.computeMethod; var votingSystem = votingSystems.filter(function(system){ return(system.name==model.system); })[0]; @@ -165,6 +171,8 @@ function main(config){ model.yeeobject = model.voters[config.keyyee] } else if (config.kindayee=="off") { model.yeeobject = undefined + } else { // if yeeobject is not defined + model.yeeobject = undefined } if (model.yeeobject) {model.yeeon = true} else {model.yeeon = false} @@ -612,17 +620,19 @@ function main(config){ document.querySelector("#left").insertBefore(choosegearconfig.dom,doms["systems"]); // get current filename, in order to go back to the original intended preset - var url = window.location.pathname; - var filename = url.substring(url.lastIndexOf('/')+1); - main(loadpreset(filename)); - var presetnames = ["O","SA"] - var presethtmlnames = [filename,"sandbox.html"] - var presetdescription = ["original intended preset","sandbox"] + + // var presetnames = ["O","SA"] + // var presethtmlnames = [config.filename,"sandbox.html"] + // var presetdescription = ["original intended preset","sandbox"] + + var presetnames = ["S"] + var presethtmlnames = ["sandbox.html"] + var presetdescription = ["sandbox"] // and fill in the rest for (var i=1;i<=14;i++) {presetnames.push("e"+i) ; presethtmlnames.push("election"+i+".html") ; presetdescription.push("election"+i+".html")} - + presetnames.push("O") ; presethtmlnames.push(filename) ; presetdescription.push("original intended preset") // TODO //for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} @@ -634,7 +644,7 @@ function main(config){ var onChoosepresetconfig = function(data){ if (data.isOn) { var firstletter = data.htmlname[0] - if (firstletter == 'e') { + if (firstletter == 'e' || firstletter == 's') { config = loadpreset(data.htmlname) loadDefaults() model.reset(true); @@ -655,6 +665,24 @@ function main(config){ choosepresetconfig.dom.hidden = true document.querySelector("#left").insertBefore(choosepresetconfig.dom,doms["systems"]); + if(window.choosepresetconfig) choosepresetconfig.highlight("htmlname", config.presethtmlname); + // only do this once. Otherwise it would be in SelectUI + + + var computeMethod = [{name:"gpu",margin:4},{name:"js"}] + var onChooseComputeMethod = function(data){ + config.computeMethod = data.name + model.computeMethod = data.name + }; + window.chooseComputeMethod = new ButtonGroup({ + label: "method of computing yee diagram:", + width: 38, + data: computeMethod, + onChoose: onChooseComputeMethod + }); + chooseComputeMethod.dom.hidden = true + document.querySelector("#left").insertBefore(chooseComputeMethod.dom,doms["systems"]); + // gear button (combines with above) var gearicon = [{name:"config"}] @@ -662,9 +690,11 @@ function main(config){ if (data.isOn) { choosegearconfig.dom.hidden = false choosepresetconfig.dom.hidden = false + chooseComputeMethod.dom.hidden = false } else { choosegearconfig.dom.hidden = true choosepresetconfig.dom.hidden = true + chooseComputeMethod.dom.hidden = true } }; window.choosegearicon = new ButtonGroup({ @@ -702,6 +732,7 @@ function main(config){ } if(window.chooseyeeobject) chooseyeeobject.highlight("keyyee", config.keyyee); if(window.choosegearconfig) choosegearconfig.highlight("realname", new Set(config.featurelist)); + if(window.chooseComputeMethod) chooseComputeMethod.highlight("name", config.computeMethod); }; selectUI(); From 3b415246e1e9b2a06bff76866bb5a050e78aec19 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 12:56:36 -0400 Subject: [PATCH 083/120] added ties. added frontrunners. (to array methods using cpu and gpu) --- play/js/FastYee.js | 184 +++++++++++++++++++++++----------------- play/js/Model.js | 46 +++++++--- play/js/main_sandbox.js | 2 +- 3 files changed, 141 insertions(+), 91 deletions(-) diff --git a/play/js/FastYee.js b/play/js/FastYee.js index ad15d019..e18f4890 100644 --- a/play/js/FastYee.js +++ b/play/js/FastYee.js @@ -1,22 +1,27 @@ -// use the functions -// cubeCandidateToWinner -// cubeVoterToWinner -// to get a list of winners -// The input is which object to move, -// what the current object positions are, and -// what the pixel size and number of pixels vertical and horizontal +// use the function createKernelYee to construct the kernel functions (which takes some time) +// it returns a function fastyee, which can be run +// variables can change and the same function can be used +// but if the dimensions of the kernel change, then the kernel has to be re-created. -// function cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ -// function cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +// old instructions +// // use the functions +// // cubeCandidateToWinner +// // cubeVoterToWinner +// // to get a list of winners +// // The input is which object to move, +// // what the current object positions are, and +// // what the pixel size and number of pixels vertical and horizontal + +// // function cubeCandidateToWinner(xv,yv,xc,yc,f,lf,candidatetomove,pixelsize,liy,lix){ +// // function cubeVoterToWinner(xv,yv,xc,yc,f,lf,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ // comment this out when running as a script -function createKernelYee(lc,lv,WIDTH,HEIGHT,density) { - pixelsize = density - lix = WIDTH / pixelsize // called density +function createKernelYee(lc,lv,WIDTH,HEIGHT,pixelsize) { + lix = WIDTH / pixelsize liy = HEIGHT / pixelsize // set some globals li = lix * liy @@ -80,6 +85,9 @@ var yf=xf var xc = xf var yc = yf +// also f is a list of indices of the frontrunners e.g. [1,3] +f = [1,3] +lf = f.length } @@ -333,13 +341,14 @@ left.innerHTML += "
"+cubeC.slice(0,100).join("
") } -const minCube = gpu.createKernel( function(d) { +const minCube = gpu.createKernel( function(d,f,lf) { var iv,civ,n,d1 iv = this.thread.x n=1000 - for (var c = 0; c < lc; c++) { - civ = c + iv* lc + for (var indf = 0; indf < lc; indf++) { + if (indf >= lf) break + civ = f[indf] + iv * lc // d1 = d[c][i][v] // d at x,y,z //(z * xMax * yMax) + (y * xMax) + x; @@ -356,18 +365,18 @@ const minCube = gpu.createKernel( function(d) { if(runscript){ -var min = minCube(cube).slice(0,lv*li) // weird. we need to slice because there is something weird going on with the output dimensions +var min = minCube(cube,f,lf).slice(0,lv*li) // weird. we need to slice because there is something weird going on with the output dimensions left.innerHTML += "
"+"min" left.innerHTML += "
"+min.slice(0,100).join("
") right.innerHTML += "
"+"min" } -function minCubeJ(cube,lc,li,lv) { +function minCubeJ(cube,f,lf,lc,li,lv) { var iv,civ,n,d1 var min=[] for (var iv=0; iv= lf) break + civ = f[indf] + iv * lc // d1 = d[c][i][v] // d at x,y,z //(z * xMax * yMax) + (y * xMax) + x; d1 = d[civ] @@ -412,21 +422,22 @@ const maxCube = gpu.createKernel( function(d) { if(runscript){ -var max = maxCube(cube).slice(0,lv*li) +var max = maxCube(cube,f,lf).slice(0,lv*li) left.innerHTML += "
"+"max" left.innerHTML += "
"+max.slice(0,100).join("
") right.innerHTML += "
"+"max" } -function maxCubeJ(cube,lc,li,lv){ +function maxCubeJ(cube,f,lf,lc,li,lv){ var iv,i,v,dx,dy,civ,n,m,d1 var max=[] for (var iv=0; iv m) { @@ -440,7 +451,7 @@ return max } if(runscript){ -max = maxCubeJ(cube,lc,li,lv) +max = maxCubeJ(cube,f,lf,lc,li,lv) } @@ -490,6 +501,11 @@ const doScores = gpu.createKernel(function(d,n,m,fnorm, minscore, maxscore) { //normit = (d[civ]-n[iv])*fnorm[iv] // indices must be wrong earlier normit = (d[civ]-n[iv]) / (m[iv]-n[iv]) score = Math.floor(.5+minscore+(maxscore-minscore)*(1-normit)) + if (score > maxscore) { + score = maxscore + } else if (score < minscore) { + score = minscore + } //return normit return score }, { @@ -519,6 +535,11 @@ for (var civ=0; civ maxscore) { + score = maxscore + } else if (score < minscore) { + score = minscore + } scores.push(score) if(runscript) right.innerHTML += "
"+score @@ -580,9 +601,13 @@ const findWinner = gpu.createKernel(function(tally) { for (var c = 0; c < lc; c++) { ci = c + i * lc t1 = tally[ci] - if(t1 > m) { - m = t1 - mi = c + if(t1 >= m) { + if (t1 == m) { + mi = c + mi * lc // encode + } else { + m = t1 + mi = c + } } } return mi @@ -607,9 +632,13 @@ for (var i = 0; i < li; i++) { for (var c = 0; c < lc; c++) { ci = c + i * lc t1 = tally[ci] - if(t1 > m) { - m = t1 - mi = c + if(t1 >= m) { + if (t1 == m) { + mi = c + mi * lc // encode + } else { + m = t1 + mi = c + } } } if(runscript) right.innerHTML += "
"+mi @@ -622,11 +651,11 @@ if(runscript){ miset = findWinnerJ(tally,lc,li,lv) } if (!onlylast) { -const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xf,yf) { +const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xf,yf,f,lf) { var cube,min,max,fnorm,scores,tally,winner cube = d(xv, yv, xf, yf) - min = minCube(cube) - max = maxCube(cube) + min = minCube(cube,f,lf) + max = maxCube(cube,f,lf) fnorm = doFnorm(min,max) scores = doScores(cube,min,max,fnorm,0,5) @@ -637,7 +666,7 @@ const superKernel = gpu.combineKernels(d,minCube,maxCube,doFnorm,doScores,doTall if(runscript){ -var winner = superKernel(xv,yv,xf,yf).slice(0,li); +var winner = superKernel(xv,yv,xf,yf,f,lf).slice(0,li); left.innerHTML += "
"+"megawinner" left.innerHTML += "
"+winner.join("
") right.innerHTML += "
"+"winner again" @@ -651,18 +680,18 @@ right.innerHTML += "
"+miset.join("
") cube2 = d(xv, yv, xf, yf) } -const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2) { - return findWinner(doTally(doScores(cube2,minCube(cube2),maxCube(cube2),doFnorm(maxCube(cube2),minCube(cube2)),0,5))) +const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2,f,lf) { + return findWinner(doTally(doScores(cube2,minCube(cube2,f,lf),maxCube(cube2,f,lf),doFnorm(maxCube(cube2,f,lf),minCube(cube2,f,lf)),0,5))) }) -// const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xf,yf){ -// return superKernel2(d(xv,yv,xf,yf)) +// const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xf,yf,f,lf){ +// return superKernel2(d(xv,yv,xf,yf,f,lf)) // }) // can't do this kind of nesting if(runscript){ -var winner2 = superKernel2(cube2).slice(0,li); +var winner2 = superKernel2(cube2,f,lf).slice(0,li); left.innerHTML += "
"+"megawinner2" left.innerHTML += "
"+winner2.join("
") right.innerHTML += "
"+"winner again" @@ -671,10 +700,10 @@ right.innerHTML += "
"+miset.join("
") } // third try -function cubeToWinner(xv,yv,xf,yf) { +function cubeToWinner(xv,yv,xf,yf,f,lf) { cube3 = d(xv, yv, xf, yf) -min3 = minCube(cube3) -max3 = maxCube(cube3) +min3 = minCube(cube3,f,lf) +max3 = maxCube(cube3,f,lf) fnorm3 = doFnorm(min3,max3) scores3 = doScores(cube3,min3,max3,fnorm3,0,5) @@ -685,7 +714,7 @@ return winner3 if(runscript){ -winner3 = cubeToWinner(xv,yv,xf,yf) +winner3 = cubeToWinner(xv,yv,xf,yf,f,lf) @@ -697,10 +726,10 @@ right.innerHTML += "
"+"winner again" right.innerHTML += "
"+miset.join("
") } -function cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) { +function cubeToWinnerJ(xv,yv,xf,yf,f,lf,lc,li,lv) { cube3 = dJ(xv, yv, xf, yf,lc,li,lv) -min3 = minCubeJ(cube3,lc,li,lv) -max3 = maxCubeJ(cube3,lc,li,lv) +min3 = minCubeJ(cube3,f,lf,lc,li,lv) +max3 = maxCubeJ(cube3,f,lf,lc,li,lv) fnorm3 = doFnormJ(min3,max3,lc,li,lv) scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) @@ -709,10 +738,10 @@ winner3 = findWinnerJ(tally3,lc,li,lv) return winner3 } -function cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) { +function cubeCandidateToWinnerJ(xv,yv,xc,yc,f,candidatetomove,pixelsize,liy,lix,lf,lc,li,lv) { cube3 = cubeCandidateJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) -min3 = minCubeJ(cube3,lc,li,lv) -max3 = maxCubeJ(cube3,lc,li,lv) +min3 = minCubeJ(cube3,f,lf,lc,li,lv) +max3 = maxCubeJ(cube3,f,lf,lc,li,lv) fnorm3 = doFnormJ(min3,max3,lc,li,lv) scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) @@ -721,10 +750,10 @@ winner3 = findWinnerJ(tally3,lc,li,lv) return winner3 } -function cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) { +function cubeVoterToWinnerJ(xv,yv,xc,yc,f,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lf,lc,li,lv) { cube3 = cubeVoterJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) -min3 = minCubeJ(cube3,lc,li,lv) -max3 = maxCubeJ(cube3,lc,li,lv) +min3 = minCubeJ(cube3,f,lf,lc,li,lv) +max3 = maxCubeJ(cube3,f,lf,lc,li,lv) fnorm3 = doFnormJ(min3,max3,lc,li,lv) scores3 = doScoresJ(cube3,min3,max3,fnorm3,0,5,lc,li,lv) @@ -735,7 +764,7 @@ return winner3 if(runscript){ -winner4 = cubeToWinnerJ(xv,yv,xf,yf,lc,li,lv) +winner4 = cubeToWinnerJ(xv,yv,xf,yf,f,lf,lc,li,lv) left.innerHTML += "
"+"lessmegawinner3 again" left.innerHTML += "
"+winner3.join("
") @@ -749,11 +778,11 @@ right.innerHTML += "
"+"done" } -const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) { +const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,f,lf,candidatetomove,pixelsize,liy,lix) { // var cube,min,max,fnorm,scores,tally,winner cube = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) - min = minCube(cube) - max = maxCube(cube) + min = minCube(cube,f,lf) + max = maxCube(cube,f,lf) fnorm = doFnorm(min,max) scores = doScores(cube,min,max,fnorm,0,5) @@ -763,11 +792,11 @@ const superKernelCandidate = gpu.combineKernels(cubeCandidate,minCube,maxCube,do }) -const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { +const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(xv,yv,xc,yc,f,lf,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) { //var cube,min,max,fnorm,scores,tally,winner cube = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) - min = minCube(cube) - max = maxCube(cube) + min = minCube(cube,f,lf) + max = maxCube(cube,f,lf) fnorm = doFnorm(min,max) scores = doScores(cube,min,max,fnorm,0,5) @@ -777,10 +806,10 @@ const superKernelVoter = gpu.combineKernels(cubeVoter,minCube,maxCube,doFnorm,do }) -cubeCandidateToWinner = function(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix){ +cubeCandidateToWinner = function(xv,yv,xc,yc,f,lf,candidatetomove,pixelsize,liy,lix){ cube3 = cubeCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix) -min3 = minCube(cube3) -max3 = maxCube(cube3) +min3 = minCube(cube3,f,lf) +max3 = maxCube(cube3,f,lf) fnorm3 = doFnorm(min3,max3) scores3 = doScores(cube3,min3,max3,fnorm3,0,5) @@ -799,10 +828,10 @@ return winner3 // }) // can't do this kind of nesting -cubeVoterToWinner = function(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ +cubeVoterToWinner = function(xv,yv,xc,yc,f,lf,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix){ cubeV = cubeVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix) -min3 = minCube(cube3) -max3 = maxCube(cube3) +min3 = minCube(cube3,f,lf) +max3 = maxCube(cube3,f,lf) fnorm3 = doFnorm(min3,max3) scores3 = doScores(cube3,min3,max3,fnorm3,0,5) @@ -816,29 +845,30 @@ return winner3 -function fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) { +function fastyee(xc,yc,f,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) { // have not implemented frontrunners yet + lf = f.length if (whichtypetomove == "voter"){ votergrouptomove = movethisidx if (method == "gpu") { - // return cubeVoterToWinner(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - return superKernelVoter(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) + // return cubeVoterToWinner(xv,yv,xc,yc,f,lf,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelVoter(xv,yv,xc,yc,f,lf,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).slice(0,li) // // return superKernel3Voter(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) } else if (method == "js") { - return cubeVoterToWinnerJ(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lc,li,lv) + return cubeVoterToWinnerJ(xv,yv,xc,yc,f,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix,lf,lc,li,lv) } } else if (whichtypetomove == "candidate"){ candidatetomove = movethisidx if (method == "gpu") { - // return cubeCandidateToWinner(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) - return superKernelCandidate(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix).slice(0,li) + // return cubeCandidateToWinner(xv,yv,xc,yc,f,lf,candidatetomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) + return superKernelCandidate(xv,yv,xc,yc,f,lf,candidatetomove,pixelsize,liy,lix).slice(0,li) // // return superKernel3Candidate(xv,yv,xc,yc,xvcenter,yvcenter,vg,votergrouptomove,pixelsize,liy,lix).toArray(gpu).slice(0,li) } else if (method == "js") { - return cubeCandidateToWinnerJ(xv,yv,xc,yc,candidatetomove,pixelsize,liy,lix,lc,li,lv) + return cubeCandidateToWinnerJ(xv,yv,xc,yc,f,candidatetomove,pixelsize,liy,lix,lf,lc,li,lv) } } } return fastyee -} // end of createKernelYee \ No newline at end of file +} // end of createKernelYee diff --git a/play/js/Model.js b/play/js/Model.js index 796016f2..0db304f7 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -92,28 +92,29 @@ function Model(config){ var pixelsize = self.pixelsize; WIDTH = ctx.canvas.width; HEIGHT = ctx.canvas.height; - doArrayWay = true + doArrayWay = self.computeMethod != "ez" var winners if (doArrayWay) { // put candidate information into arrays - var canA = [], canAid = [], xc = [], yc = [], fillc = [] , revCan = {} // candidates - var fA = [], fAid = [], xf = [], yf = [], fillf = [] // frontrunners + var canAid = [], xc = [], yc = [], fillc = [] //, canA = [], revCan = {} // candidates + var f=[] // , fA = [], fAid = [], xf = [], yf = [], fillf = [] // frontrunners var movethisidx, whichtypetomove var i = 0 for (can in self.candidatesById) { var c = self.candidatesById[can] canAid.push(can) - canA.push(c) - revCan[c] = i + // canA.push(c) + // revCan[c] = i xc.push(c.x*2) // remember the 2 yc.push(c.y*2) fillc.push(c.fill) if (model.frontrunnerSet.has(c.id)) { - fAid.push(can) - fA.push(c) - xf.push(c.x*2) - yf.push(c.y*2) - fillf.push(c.fill) // maybe don't need + // fAid.push(can) + // fA.push(c) + f.push(i) + // xf.push(c.x*2) + // yf.push(c.y*2) + // fillf.push(c.fill) // maybe don't need } if (self.yeeobject == c){ movethisidx = i @@ -175,7 +176,7 @@ function Model(config){ //method = "gpu" //method = "js" method = self.computeMethod - winners = fastyee(xc,yc,xf,yf,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) + winners = fastyee(xc,yc,f,xv,yv,vg,xvcenter,yvcenter,movethisidx,whichtypetomove,method) } self.gridx = []; @@ -189,8 +190,27 @@ function Model(config){ for(var x=.5*pixelsize, cx=0; x<=WIDTH; x+= pixelsize, cx++) { for(var y=.5*pixelsize, cy=0; y<=HEIGHT; y+= pixelsize, cy++) { if (doArrayWay) { - var a = Candidate.graphics[canAid[Math.round(winners[i])] || "square"].fill - if (a == "#ccc") {a = "#ddd"} // hack for now, but will deal with ties later + var winner = Math.round(winners[i]) + if (winner > lc) { // we have a set of winners to decode + //winner = 3 + lc* (2+lc*(4)) + //var decode = function (winner) { + wl = [] + for (var s = 0; s < lc; s++) { + if (winner <= lc) {break} + wl.push(winner % lc) + winner = Math.floor(winner / lc) + } + wl.push(winner) + // return wl + //} + colorlist = [] + for (w in wl) {colorlist.push(Candidate.graphics[canAid[wl[w]] || "square"].fill)} + self.gridb[i] = colorlist + var a = "#ccc" // grey is actually a code for "look for more colors" + } else { + var a = Candidate.graphics[canAid[winner] || "square"].fill + } + // if (a == "#ccc") {a = "#ddd"} // hack for now, but will deal with ties later self.gridx.push(x); self.gridy.push(y); self.gridl.push(a); diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 0c34751a..b06067d1 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -669,7 +669,7 @@ function main(config){ // only do this once. Otherwise it would be in SelectUI - var computeMethod = [{name:"gpu",margin:4},{name:"js"}] + var computeMethod = [{name:"gpu",margin:4},{name:"js",margin:4},{name:"ez"}] var onChooseComputeMethod = function(data){ config.computeMethod = data.name model.computeMethod = data.name From dba913d839853e6b167e78749db100ad246a0105 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 12:59:03 -0400 Subject: [PATCH 084/120] small fix. variable name. --- play/js/FastYee.js | 55 ++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/play/js/FastYee.js b/play/js/FastYee.js index e18f4890..c09090e0 100644 --- a/play/js/FastYee.js +++ b/play/js/FastYee.js @@ -70,8 +70,8 @@ right.innerHTML += 'left is gpu output. right is true values.' // var lv = 2 // var li = 10 // 400 -var xf = [] -for (i =0;i") right.innerHTML += "
"+"cube" } -function dJ(xv,yv,xf,yf,lc,li,lv) { +function dJ(xv,yv,xc,yc,lc,li,lv) { var cube=[] var civ,i,v,c,d,dx,dy,ci for (var civ=0; civ") right.innerHTML += "
"+"winner again" right.innerHTML += "
"+miset.join("
") // for ( var j=0;j<100;j++) { -// var winner = superKernel(xv,yv,xf,yf); +// var winner = superKernel(xv,yv,xc,yc); // left.innerHTML += "
"+winner[0]) // } -cube2 = d(xv, yv, xf, yf) +cube2 = d(xv, yv, xc, yc) } const superKernel2 = gpu.combineKernels(minCube,maxCube,doFnorm,doScores,doTally,findWinner, function(cube2,f,lf) { return findWinner(doTally(doScores(cube2,minCube(cube2,f,lf),maxCube(cube2,f,lf),doFnorm(maxCube(cube2,f,lf),minCube(cube2,f,lf)),0,5))) }) -// const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xf,yf,f,lf){ -// return superKernel2(d(xv,yv,xf,yf,f,lf)) +// const superKernel3 = gpu.combineKernels(d,superKernel2,function(xv,yv,xc,yc,f,lf){ +// return superKernel2(d(xv,yv,xc,yc,f,lf)) // }) // can't do this kind of nesting @@ -700,8 +697,8 @@ right.innerHTML += "
"+miset.join("
") } // third try -function cubeToWinner(xv,yv,xf,yf,f,lf) { -cube3 = d(xv, yv, xf, yf) +function cubeToWinner(xv,yv,xc,yc,f,lf) { +cube3 = d(xv, yv, xc, yc) min3 = minCube(cube3,f,lf) max3 = maxCube(cube3,f,lf) fnorm3 = doFnorm(min3,max3) @@ -714,7 +711,7 @@ return winner3 if(runscript){ -winner3 = cubeToWinner(xv,yv,xf,yf,f,lf) +winner3 = cubeToWinner(xv,yv,xc,yc,f,lf) @@ -726,8 +723,8 @@ right.innerHTML += "
"+"winner again" right.innerHTML += "
"+miset.join("
") } -function cubeToWinnerJ(xv,yv,xf,yf,f,lf,lc,li,lv) { -cube3 = dJ(xv, yv, xf, yf,lc,li,lv) +function cubeToWinnerJ(xv,yv,xc,yc,f,lf,lc,li,lv) { +cube3 = dJ(xv, yv, xc, yc,lc,li,lv) min3 = minCubeJ(cube3,f,lf,lc,li,lv) max3 = maxCubeJ(cube3,f,lf,lc,li,lv) fnorm3 = doFnormJ(min3,max3,lc,li,lv) @@ -764,7 +761,7 @@ return winner3 if(runscript){ -winner4 = cubeToWinnerJ(xv,yv,xf,yf,f,lf,lc,li,lv) +winner4 = cubeToWinnerJ(xv,yv,xc,yc,f,lf,lc,li,lv) left.innerHTML += "
"+"lessmegawinner3 again" left.innerHTML += "
"+winner3.join("
") From b6f045b9136023a7f8fff9e4bc5dba5dc6121ed5 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 14:26:32 -0400 Subject: [PATCH 085/120] adding SingleVoter to sandbox. Halfway there. Just need the ballot sheets.. The main arena is ready and the config menu is ready. --- play/js/Model.js | 5 ++++- play/js/Voters.js | 18 +++++++++++++++++- play/js/main_sandbox.js | 20 ++++++++++++++------ sandbox/sandbox.html | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/play/js/Model.js b/play/js/Model.js index 0db304f7..6e2cb956 100644 --- a/play/js/Model.js +++ b/play/js/Model.js @@ -241,6 +241,7 @@ function Model(config){ // calculate yee if its turned on and we haven't already calculated it ( we aren't dragging the yee object) if (self.yeeon && Mouse.dragging != self.yeeobject) self.calculateYee() + // Clear it all! ctx.clearRect(0,0,canvas.width,canvas.height); @@ -321,7 +322,9 @@ function Model(config){ ctx.fillText(text, x, y); } ctx.textAlign = "center"; - drawStroked("yee-yee!",x*2,y*2); + ctx.globalAlpha = 0.9 + drawStroked("yee-yee!",x*2,y*2+50); + ctx.globalAlpha = 1 } // Update! diff --git a/play/js/Voters.js b/play/js/Voters.js index dc7bc9ed..7bf8e85e 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -780,17 +780,33 @@ function SingleVoter(config){ var self = this; Draggable.call(self, config); + + // not sure if we need all these, but just in case + self.num = 1; + self.vid = 0; + self.snowman = false; + self.strategy = config.strategy + self.frontrunnerSet = config.frontrunnerSet + + // WHAT TYPE? self.type = new config.type(self.model); + self.setType = function(newType){ + self.type = new newType(self.model); + }; // Image! self.img = new Image(); self.img.src = "img/voter_face.png"; + + self.points = [[0,0]]; + // UPDATE! self.ballot = null; self.update = function(){ - self.ballot = self.type.getBallot(self.x, self.y, self.model.strategy, config); + self.ballot = self.type.getBallot(self.x, self.y, self.strategy, config); + self.ballots = [self.ballot] }; // DRAW! diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index b06067d1..d7fe5fa7 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -130,8 +130,13 @@ function main(config){ } for(var i=0; i + From b0af7a9f71dc176dda88a396da6e33ffca7c7ec2 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 16:39:17 -0400 Subject: [PATCH 086/120] added ballot papers display. almost there. it still doesn't work if there are more than 3 candidates. --- play/css/ballotInSandbox.css | 31 +++++++++++++++++++++ play/js/main_sandbox.js | 53 +++++++++++++++++++++++++++++------- sandbox/sandbox.html | 1 + 3 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 play/css/ballotInSandbox.css diff --git a/play/css/ballotInSandbox.css b/play/css/ballotInSandbox.css new file mode 100644 index 00000000..5c354417 --- /dev/null +++ b/play/css/ballotInSandbox.css @@ -0,0 +1,31 @@ +/********************* +BALLOT DESIGN +**********************/ + +#right{ + width: auto +} + +#ballot{ + + width: 375px; + height: 250px; + margin-left: 0px; + margin-bottom: 0px; + margin-top: 20px; + + background: #F0EAD6; + color: #302707; + + background-size: 100% 100%; + border: 2px solid #fff; + + position: relative; + + +} + +#ballot .ballot_sprite{ + position: absolute; + background-size: 100% auto; +} diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index d7fe5fa7..ce5de3fb 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -113,6 +113,7 @@ function main(config){ return(system.name==model.system); })[0]; model.voterType = votingSystem.voter; + model.ballotType = window[votingSystem.ballot]; model.election = votingSystem.election; // Voters @@ -189,6 +190,23 @@ function main(config){ model.election = Election.plurality; model.onUpdate = function(){ model.election(model, {sidebar:true}); + + // CREATE A BALLOT + var myNode = document.querySelector("#right"); + while (myNode.firstChild) { + myNode.removeChild(myNode.firstChild); + } // remove old one, if there was one + // document.querySelector("#ballot").remove() + if (config.oneVoter) { + window.ballot = new model.ballotType(); + document.querySelector("#right").appendChild(ballot.dom); + } else { + document.querySelector("#right").appendChild(model.caption); + } + + if (config.oneVoter) { + ballot.update(model.voters[0].ballot); + } }; // In Position! @@ -223,7 +241,7 @@ function main(config){ }; - + ////////////////////////////////// // BUTTONS - WHAT VOTING SYSTEM // ////////////////////////////////// @@ -231,14 +249,14 @@ function main(config){ // Which voting system? var votingSystems = [ - {name:"FPTP", voter:PluralityVoter, election:Election.plurality, margin:4}, - {name:"IRV", voter:RankedVoter, election:Election.irv}, - {name:"Borda", voter:RankedVoter, election:Election.borda, margin:4}, - {name:"Condorcet", voter:RankedVoter, election:Election.condorcet}, - {name:"Approval", voter:ApprovalVoter, election:Election.approval, margin:4}, - {name:"Score", voter:ScoreVoter, election:Election.score}, - {name:"STAR", voter:ScoreVoter, election:Election.star, margin:4}, - {name:"3-2-1", voter:ThreeVoter, election:Election.three21} + {name:"FPTP", voter:PluralityVoter, ballot:"PluralityBallot", election:Election.plurality, margin:4}, + {name:"IRV", voter:RankedVoter, ballot:"RankedBallot", election:Election.irv}, + {name:"Borda", voter:RankedVoter, ballot:"RankedBallot", election:Election.borda, margin:4}, + {name:"Condorcet", voter:RankedVoter, ballot:"RankedBallot", election:Election.condorcet}, + {name:"Approval", voter:ApprovalVoter, ballot:"ApprovalBallot", election:Election.approval, margin:4}, + {name:"Score", voter:ScoreVoter, ballot:"ScoreBallot", election:Election.score}, + {name:"STAR", voter:ScoreVoter, ballot:"ScoreBallot", election:Election.star, margin:4}, + {name:"3-2-1", voter:ThreeVoter, ballot:"ThreeBallot", election:Election.three21} ]; var onChooseSystem = function(data){ @@ -247,6 +265,8 @@ function main(config){ // no reset... model.voterType = data.voter; + model.ballotType = window[data.ballot]; + for(var i=0;i + From 052c30283a9fafbdcb56a238a2646d217123b2b2 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 20:06:34 -0400 Subject: [PATCH 087/120] single voter works. added images for 5 candidates (rather than just 3). also fixed the "voter number" button highlighting. --- newer.html | 24 ++++++------- play/css/ballotInSandbox.css | 9 ++--- play/css/election.css | 2 +- play/election1.html | 2 ++ play/election10.html | 2 ++ play/election11.html | 2 ++ play/election12.html | 2 ++ play/election13.html | 2 ++ play/election14.html | 4 ++- play/election15.html | 4 ++- play/election2.html | 2 ++ play/election3.html | 2 ++ play/election4.html | 2 ++ play/election5.html | 2 ++ play/election6.html | 2 ++ play/election7.html | 2 ++ play/election8.html | 2 ++ play/election9.html | 2 ++ play/img/ballot5_approval.png | Bin 0 -> 36479 bytes play/img/ballot5_box.png | Bin 0 -> 11010 bytes play/img/ballot5_fptp.png | Bin 0 -> 36570 bytes play/img/ballot5_range.png | Bin 0 -> 29940 bytes play/img/ballot5_range3.png | Bin 0 -> 31867 bytes play/img/ballot5_ranked.png | Bin 0 -> 36543 bytes play/img/ballot5_rate.png | Bin 0 -> 66569 bytes play/img/ballot5_three.png | Bin 0 -> 32885 bytes play/js/Ballot.js | 65 +++++++++++++++++++++++++++++++--- play/js/main_sandbox.js | 34 ++++++++++-------- 28 files changed, 129 insertions(+), 39 deletions(-) create mode 100644 play/img/ballot5_approval.png create mode 100644 play/img/ballot5_box.png create mode 100644 play/img/ballot5_fptp.png create mode 100644 play/img/ballot5_range.png create mode 100644 play/img/ballot5_range3.png create mode 100644 play/img/ballot5_ranked.png create mode 100644 play/img/ballot5_rate.png create mode 100644 play/img/ballot5_three.png diff --git a/newer.html b/newer.html index 543c553b..163d3914 100644 --- a/newer.html +++ b/newer.html @@ -204,7 +204,7 @@

Normalizing Voter

non-optimal

- +
@@ -218,7 +218,7 @@

Normalizing Voter

Strategists win

- +
@@ -284,7 +284,7 @@

Not the Worst Frontrunne

Playing Chicken

- +

@@ -302,7 +302,7 @@

Not the Worst Frontrunne

Playing Chicken with Different Methods

- +

@@ -310,7 +310,7 @@

Not the Worst Frontrunne

Center Squeeze

- +

@@ -344,7 +344,7 @@

Star Strong

Chicken Star

- +
@@ -376,7 +376,7 @@

321 Strategic

321 Chicken

- +
@@ -665,7 +665,7 @@

SCORE VOTING

- +
@@ -683,7 +683,7 @@

SCORE VOTING

drag the voters slowly up towards :

- +
@@ -716,7 +716,7 @@

SCORE VOTING

drag to just slightly left of :

- +
@@ -744,7 +744,7 @@

SCORE VOTING

move the voters in such a way that NOBODY wins:

- +
@@ -829,7 +829,7 @@

SCORE VOTING

and Johnson wins Borda??

- +
diff --git a/play/css/ballotInSandbox.css b/play/css/ballotInSandbox.css index 5c354417..a783223f 100644 --- a/play/css/ballotInSandbox.css +++ b/play/css/ballotInSandbox.css @@ -3,16 +3,17 @@ BALLOT DESIGN **********************/ #right{ - width: auto + width: auto; + height: auto; } #ballot{ width: 375px; - height: 250px; + height: 350px; margin-left: 0px; margin-bottom: 0px; - margin-top: 20px; + margin-top: 30px; background: #F0EAD6; color: #302707; @@ -21,7 +22,7 @@ BALLOT DESIGN border: 2px solid #fff; position: relative; - + transform: translate(-50px,-50px) scale(.8); } diff --git a/play/css/election.css b/play/css/election.css index 396995c3..ae2616cd 100644 --- a/play/css/election.css +++ b/play/css/election.css @@ -20,7 +20,7 @@ Election/Sandbox design: height: 370px; } #right{ - width:220px; + width:376px; padding-left: 20px; overflow-y: auto; } diff --git a/play/election1.html b/play/election1.html index 07f5183e..476fe7ec 100644 --- a/play/election1.html +++ b/play/election1.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election10.html b/play/election10.html index 07f5183e..476fe7ec 100644 --- a/play/election10.html +++ b/play/election10.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election11.html b/play/election11.html index 07f5183e..476fe7ec 100644 --- a/play/election11.html +++ b/play/election11.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election12.html b/play/election12.html index 07f5183e..476fe7ec 100644 --- a/play/election12.html +++ b/play/election12.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election13.html b/play/election13.html index 07f5183e..476fe7ec 100644 --- a/play/election13.html +++ b/play/election13.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election14.html b/play/election14.html index ced708ab..476fe7ec 100644 --- a/play/election14.html +++ b/play/election14.html @@ -4,6 +4,7 @@ +
@@ -22,7 +23,8 @@ + - \ No newline at end of file diff --git a/play/election15.html b/play/election15.html index ced708ab..476fe7ec 100644 --- a/play/election15.html +++ b/play/election15.html @@ -4,6 +4,7 @@ +
@@ -22,7 +23,8 @@ + - \ No newline at end of file diff --git a/play/election2.html b/play/election2.html index 07f5183e..476fe7ec 100644 --- a/play/election2.html +++ b/play/election2.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election3.html b/play/election3.html index 07f5183e..476fe7ec 100644 --- a/play/election3.html +++ b/play/election3.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election4.html b/play/election4.html index 07f5183e..476fe7ec 100644 --- a/play/election4.html +++ b/play/election4.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election5.html b/play/election5.html index 07f5183e..476fe7ec 100644 --- a/play/election5.html +++ b/play/election5.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election6.html b/play/election6.html index 07f5183e..476fe7ec 100644 --- a/play/election6.html +++ b/play/election6.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election7.html b/play/election7.html index 07f5183e..476fe7ec 100644 --- a/play/election7.html +++ b/play/election7.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election8.html b/play/election8.html index 07f5183e..476fe7ec 100644 --- a/play/election8.html +++ b/play/election8.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/election9.html b/play/election9.html index 07f5183e..476fe7ec 100644 --- a/play/election9.html +++ b/play/election9.html @@ -4,6 +4,7 @@ +
@@ -22,6 +23,7 @@ + diff --git a/play/img/ballot5_approval.png b/play/img/ballot5_approval.png new file mode 100644 index 0000000000000000000000000000000000000000..864520027eb34e9d1b96d3619d41a0e12dd96f4e GIT binary patch literal 36479 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�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

rxkZuFdYQxn+NQj{cNWx8{0OU^71e z;M>;4^?gGU6m(`G!o#cH=;XSSLx2=lQxjWYhWw3gZf$m0sD|XSMaun2a4m60VLxXNvx^d@t zl+VW-vmSH;0iUMYZ>XGB>vH>)s8=^2p?m1=uQnXgL@eni0la)(p5n3nY4sYU0VQTj zTni232HU|Xs6cW=?nR7T zKVRDDPdy7Ekw?#tACO)YE9ad8S+d+*o7v z2F6$I+92NnTPydcAV!uZG0ykN*2vcn+K;P*y4NPr29d}Ez9wM%N+Rdv?#^$}N;X0m zkUb#XXkzZhe=E?{QpQ3YXl~=dr;#Z$J3<-hbNBv!6%ajpZ?6fx*dQs)NNS_pHlE!1 z)kgnSH}YY4T+X?;f*XICg(+ZJ3M2#%tNwHYYU+1%n0E83yW0Tc)#!+>^k`-T3}Z?UVjGwYt$b8L6Y7haMasDU5k2mmw}v6)+<9vnx8 z*NQ5JUHY0C)ljD4zU$ZwF*~V+b;SNpCXEB(x7-Jstq+Z|9o48N@K>_fRq)~I zMR)=Wv!I~JI=WqfFL>w~QjxSKE{Lj}eCYjYf4g5n2VMPnb(lH3A;Z)Gqms}5dqnGZ z%5NN}sswN9y9}RKdY(QCo<6Q0H-k}i;4Xwm_AUnoOJv8C!oNV=3Ds$@<}hL38%tDM z-pCnS3QX!05FwwBu+bx{2d{8DI6T>H(U761?+c6&MF$J2dy+xH*D{-7Z$u^{pqQUF z%q@;Z)cbZiS632DI}0jO;7@Q7qn9zJz`tCWT5eT!?&Z+|NBoD8^1wil1->xACoA8D zj=7RIB~RLc$bzRkm>&I}^eQFR0r}kD-@k|;L_0u~YG^|L9k}}KuH-ir7Bmd@eQYAc z7QeHUgS!odibIGn^HphhSj7V%rC!<4L6T-^EZdW;HMK-#zJdaWgn;mT(-R8`0U?M5 zo}Tye8bTHZ0^)-{_#=P;{P_3#;1vJc`{33fUfL4^;{SgC<%|F2{eK_upZEXs0smj0 zXtmjh=}K97W;%G3>>Whcu2~R-r$s>jR?*bbG$L)QG_i#Y$;(anEp>E!+wBHY2G#Pm zEGBSsmT4uWn*dJ9_0`QyxAxnYI-y9HYg;!AlZ4n}&UETYkJgY#O!S(G4# zs*}>v__I)(iK0J)D}G(^$bn9xyp^+x_9zfb>ccGrWYA=>15(+y9Pxuql+{M}*c|9C zHpEM&2g*fFa=g2jk_-)OX{i)vzWKhLjpvUoO~*a!Gb6{pN-)wltqsO+KsC?OX}qhY zrAqm6|F`S`vB@1lo2)t?V+pbR55jWISAM-B$-q+SXIDW<2rcWnCJ{VA6*me$%V#T;5 z=vsqxP~R=wH79r5&qiFC;Iz=MX7B&wssQ;xpAHiRCG*Yoai4F~o#biLc4*JjO^jz# zuq|Ky?s=88Keg5%ecrPHb^Lbr8&5Ltr($D=;drT)agXYx;ZW(@-`iza-LWdGSG}I$ z^rDP`zWaN5h*dX~z%f3Cis?Oin#%NH9H4KD@IEKVZVe#eKRqd=_XU$go({>4e3;L1}Iez|)P= z#do`vYfoq4d}F&Y;DPGz=KRVx};zlr1}s3@kjXCLV>P_t>J=se&=7TigioQclQ;n$K20NF1cfI?h@jvG?wvK zO$(2386%zs@4}9bKPnt*fmz@g?zc;6pW-XtAo|5B^mP{e-PmRGgwX*;@aW|VCgGM- z+LCpH>u&dTTCEyGL;a)~>`0;mbFvAGwzMB@Axa9Bs&%Y_OVKWmlMPU7kUKtZDo{rD zB{WxPUTX(_Ef>nm|2Yv=(yvBy+`R66-)5O^HWNGw(s7XDDq{H|ZBZz7F0XtnZ>mg9 z_qCs0DCLd^;$I80ALCrp9t>X9gjbsDVz9diTSV=u<%&WMNEO;kQCekklRL1v{$Q`x zW8BZj#i@z_vv1c{EH?Q;&OY=&#%=AJVVe(a|97Z3Dvy2h@W`c$(dV=DGPfoDy<(+A zTuoRe&g2q3VM7M-I3(?NMJldaPjnn_Jg8U*Ve7+PoX$k4+^;ow0(%-Kve%&0eD5VoZ}?K-Tx

4qD?cdAak|4oz{Tm(hd>U=> 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 Toa+vpnr85H^>bP0l+XkKQRZJ1 literal 0 HcmV?d00001 diff --git a/play/img/ballot5_range.png b/play/img/ballot5_range.png new file mode 100644 index 0000000000000000000000000000000000000000..178aa16bd06ae0bcecabbaf0b07f530d4e82d286 GIT binary patch literal 29940 zcmdRWWl&trwl)$V1Pg%#hXi+my9IZ5m%*LEHNoB8Wq`rmC4}HUxRV6e1b4ojbLv)| zs`vglb^m=oW)FMqo<(=>?$xW;v!0GnR+PecMfeI14h};`T3i(l4&em&biPCYB*MH^ zCcqZ~SV9}D=4b)-FmVCFiJCi_g5Jy6n^=NWK_=#2&ch%9I5=>sjJT+}=kigPl9j$r z?kTi9EvB#2n*X~oHlZ#xf_Z%H#-_Aa!UvYnDbvs?JJn_NWzKkO8Z`+%FN_q4ULOs0 zruO{-cv;$z&H|Di^R}&)#E_QZ1zT`DS+MezK**RGZYcN1o^Z2A zFqq<`i{^>`)1B{YYRZk)fC<5X?p+W6-RpZp&@~GMPwrgjWL^n=a`|^KNcVQ2bi;>sskf)rAWwM3yr)x6prUR{;^gk=w{P=+_(9ip{Xr*O6 ztyg|-7|+PRD>Z=dchx?Wfj*_Alp6Xo7RgIB>ezwQM&x?x`PhaxqarQ@VuB?iq zuB$A(5%kk_8Zym_IjakDi{Bg}unD1e?=?CicU4$~{ z)bOF9z4ar+#OkL3mt`0vX0IjK(zCd&KdErR56Wp}N$U^T2zG8^T24Y|(E(NQ z$W-Gtd*HF~roK)`Ryg=gT-gjeca0YM#xBG6g8QY{Lb6@lW*4tdZyHTcd#M=>doD+Q zm^y5POZo_He_eQGEKQJ)RMOSuXKUWRTu^83?_V9o9QHA=Y`E%t8G#8csvD1|1|RML z|9wTY1C*pU1c!L)Wsi(|9z0yO3GxuV+Ug>4yv)`5diSb4dv-H>xI7%;4^eHf638@Wb^E1>w)$B{KJaX8ch5LCebUVdNmh`@V-NfN^&;gp@&E+zAx&C!k zhRLSL7?M08HIeg0oE4^4wKM-FB4T1=did(#qloIjMBSUHOS99ye;XLCtaGpp#pT!D zu%ch1%=6Ox$$5!My*FJMVDIMA8ES%G5FG9gyY^e{Ra|DgamP9K;e#~q@Yp0$3 z8X8Qf7`jhcP{AAxF+ckp%|pW+zp_qm&n*c}xQ%`}rK!d;{J8Oapt60lWLhVuT5hqY zfy8(^?Qog*e080xwp1{%?e*>*TkjX`gJNF^*~xRo?MPLyAmJikjRcdMkws*o#wXpf zF&y24R{7DCmF82OWyP(|u}bPYJ3(*2sIG=`5bTQ;m&go4Lf5scc$GME_AnJ|FoS48 zjZw+(V0jBQUFK%7M$n}Ji27ZJ@`lL_&o*T*NefBOVvxR^_ty>&p}l?%T?;!bQf4h* zgv^YmWtDMhl;WzjATWx{TdxmV2S`r?(zFEa0*}(2 zxoe-+YuwY=QjU~IhVV zI5JY5s%D zd#SIJV_}Lo8~(9G&{$ffj1ogS47ajc06C?EP-S=CTaLOT1Z;TsilgR-G4lif!}~lyfZF31RCgZLBNGKUOMNB{|dN>!=kf57ExZ z)YY3-&{#?R@0Q|X{G^rM#3>P<;yAp>`qCIX%u|lqb@?=I-2t)iR*Cv{@EqwSGVObr zdu~6dkrpw^%zG5AjA?%c`!n)Fbt}P0iIzo$QpL%v@>+s-e~I|m#NSWFVCD!*w+6HC z18BgE=6N1+A}eLlUSLdT=J-BM=hKWVi@g#}6l`2(eBN2Hosxt?q3ijGM))9AWrUQe zSgqkQa_#NBrPg7?XTc^bgkxxF33Y&{kLaYD+z+oCur4nAe!PIrCy2;a%*rn#NOSnP zD$7FICysA5Ac>A;tG(uqxS)yRX!Ioa1%eu;U?oq(y4A$Cxpo7ah0{Nvz-jEE%4KOR z+BwMy<>h6~B5AAAjoAqC5z&KkO)ZkOZKQ|^v~+#%fqr>vd+xq2-NJdA0@w_RwHj#% z(>E>IzSQ#G_ToC#rNPn1EU%D^j@@&m@foDJfK%$47)h4&b7>@Z4p7XjmU>gF_k6(- z(tF;9+4Jhw32?=`HU^rm>^jv&N!eSLHizF<21Y3pOI1SHJ;b~L6AqV67hf;=G_yoV zjh@b}cm^{f>cV8=4y-s5y{)J}lq^fXO{u@sqY{Q1l7vc*EM9hK*m?9MOt?=`CM~SX zW_&$SDjJuyziJS!I1T4O?-+=i?Zb&;RK7-lUc*GepaYA;^Z}56TlJXFtZ=@z?>-GE z8cBl2JXa?+TdL&VC&h2_eZm>*@S>V!f~M+_zu+d>iE!c>w;`rs(pc1G(efK!nl2@^ zwOY$<{v*oV6<1sBw^i|q8|dkfjP>!!`kPf<M(LSe!nsaZz$%oN9)7;YS1QG%Oq`?LV|}-Qw0bJ0h$h zi6{wq`_N(KEVZKH`9DLd)_M#*0#T&}5tW^IL^Jj;T=JTK)E>WDs?yyG*W}uVA8RW9 zA?Fqu6PJ+~huqBKCAy3^j4^4s^AOy9r5kY*oEO@#tIk$rb)k~<%A&MpcsH-@1%87T zoI(?-dkkL!(5EsZjhT<%Jq?ERi|Z=b*!_hE8;#>W?LXBgxT>OU4^Dnms~?+&2|X4E zUh(_)UP2hO4!g2H8rRyH%^&Vo)26+=#43y9W7xr;9Q(Bx-xiOpQEU*c^BZ%Xwcum` z-qqB=;OycThHJf_kCmOz>bS0-W^Iz0mAa(f4HuI14zl{T(fnxJ#jmC$PM_xTAB2T$>$@()n zQtdB{k7(_)mN>KJ1%&?Wcf}!iqpT4T#3?lzq+h9O1)@Y3(X0NTjXU+AXFs!k!-{9a zZa{_#xg4QAqi+9QTR*ok`ssIw4bGoFqI12Mm>Q(bI?Rh`3Ip`he0R|Wh*dB50)Hqt zbRSyFi@z+Fp%&R0*_cyYD#$)CV0vYIQR}*HE6Cf{Ma-C3m}H=?`x&q+VqHqbHqa_s zZ~@cY2y+k4{+x+bCEG74A+;)|;jngs5mcfy7X@_gxJaAIjgpOoby@G%N;MxWYcu!8 z1M8G)exmZ2m~oM3;%Hu7@zcq;O(n(3g9|n!wj+13vUFxlWYm)H72E}9=-f)Jj_{7` zcKr`UW6NZyzg7WL#O+Oq)nRS!Y}FFUF=(ysY7YtPhw6+tJ@(4gz^+{UvLQ;X+)$!s1w8Qcrch$s^Bd-^2ce?9a*=mt z%}o<0-K!1`bFib&m-QlD+-ODQVj6U}s6SaMLl_==G{y8w&X%b|QVrj62u1VfTGbv; z=S)0{qvr&4UwwW*E@mUI)`D+8(919V*#5SSN(Ip-?^@l%fFb67kWoj6w;qDxI5@;f z#I#(iy@-vuB^DUM>(M#Rog(gt5*Q+HwR_oFTRo6C5Ok>yzr!#{2lWOadswpR?ln}n zRppQi`hs#!MW@u%zLt+!ubSa$PFHZdlcxM1ypz&iRB-ehOiy zp{8_kal<0xs`6e5^a8Evq+3J&)1PJ}#}G@y%s*fQ8y2A%P>GXu2m7I|i<(v(r0%)a zV8)^=V^VX5rRqgTQ5BiRrG97%m?TMCXZy8~0GpJv_&(yX_-1Ct-d!~&AyZ%5%ITcA zPG5AqBz-E$>XsumywC-lLZ7rx+gnO#EjDOy{Ac@#pMcFxS`NI5U4bLh*<&KYjHjrB!gk_1Ny$MMg==hFU{+n*iWTUWUDpCN-%+$^#9cV#F6 zRe|*kD~;Q`n+R!Ff~z?xF8%N+)?VU(qKvQCY-nH=eZOT0_&?^Lx8!V%*Ky~9*;vw8 zBDGnoJeZ!x)TId8=5DY%?-)22)xDvA;C;l}4M!0X1=EZq-$94%sDR@S3)2J-#%nwcZr%{f|%~sWXcFA~3R4+$wD7 z$K<$iIU9qoOivD#X+9Nv6!9Sdi=R#!P%)ywnu$Es%*0q3-?=L7o4!tiuaSVY3_U1> z{?2>eeWqOojkqlB7tc5hzXti}p(qZoYer}{JUP{vQGm$2-SB1U*j2AT&Q*(!)7$Ui zH)V3Ty{JPS*P=lz&BQprwRHE~m{Q>2LpjzAL`kczI{(hFtQH)~(8%r2-Q*AD<-gQ*ft2BcmTUGf=SA$Ad6Kh`pFxHi_uQU$}Mh+znf;azkxi219?>3(vhGnxM(Ty2R4;qTOYyR0KVLhlN_?W(C5IP$DQGg z)tdA*VtH%1rfu@WtNWIK-$)NCE}db@EX2=k;W__k?GejmY1l)^chn|dI$Ie3ypxe~ zb^EEzif7&#j~kKZbruj2u(Gy>_^FMgCW&=7I<-xW$i~a7mqs4+W(BI)b6$(f>R~yo z2HD>ux?9o0ZkP)W#05WZ9ebRhS6A=F;`HW=(mF4(4h46T@Q?U}y*On^MK&!j>m1zF zWmS!Hvq0grK5e(5N@4Hx*NhYM(o)8`0TTk|UzejOOnKxzDyzB<-YY1MlZr0JlS9BzhK) z4*Z~PIMKck#d*p>WgdEr6ERd)cplQJSK$pEP!|ui?DUN>I(a&t#`RC-TdrrQK z=pvOWp2}ogxXcoe=De8+0`>w62t7m-A@JCok zT5Q|D`&6Om#@8x)h*tK493EmldYqEoV1}v7R1Tp6cBy^?-l5b+c)IqrXE!9e5eK4) z>&Uzu$SytYHcD2z{41PZ^?-@1OJ?2wd=wMVbN@507qOu3^`csJNQk`C%iGk4+hgOL z0$1@Kf2jlTjPo~26lKvV_qKhHtk~8j>yaOfOdOgivNCi^`?y=p3N;l9d)f0a=ZFxS zp|Ca;$+VUo&3(qyVYiJQLt+Gh>CsVe>iEr?pS{2Qe*SJNVrz+87c7Zd8?d)$x++1W z*TP}RzoPiDuwd>Z#jloGC8*-vyR9wqZ-fm_9uRd~!M=ik#mKnQ@YS)_fNqYIXYU zc+Pxx^A$n-r|6r48D%S~YMgPMjpPI>=8<-TAhugM$i6pq6nuoi(a9v~^QSPu{o3NC zbTpZs{q7;?H`^*s$_TrO_~EZl5ik{pz!7!`MA97dpfF*MN?ozfrT zHKRjhk~UmSM1ho!8?htvn0QB;%Vbt6dzDo;Y@2A--r>g=2t@W4;6>IYe)PAuH)=8N ze#GNQ)t%Y=h78SCjV9dr+UTH=Qt38FlCY!tcDx0lFg0VXL2vD2%wka{wCmF0AYrYw zc>iq_%N!s1qht%$%|*|t~wz`D03`)><|YuD*yVuWi0jlc6ySGFsS4djm6zT&!mUaUCz1n=%!B8LlF!wUo^@ z$kS4!jaf~lmJ=RDJ z>slmova8wX4#E6xb2f_4XM;0g(osY#rKQxz$|BAF7_rne2j5c{&Zm_QFs@FG(5gV=A>^$>f3WVf_lvAOFDK&X_DmScifE>dPF5fe+VT zgQB9&VFuOPc}r^ADnziN;Sl)}8HmQ;y2_Ikt^@!tSky@u}GjvwoL*ZwEPSR0_DwC8O{$;&s+Cg@>y~ zJ_0Q|QUQH*#zTzOI1YKqo=YAh^S$_6R5I|u$|i=pI|dfF(RCg)wbY#46D{VSkn_0S z$`tBNe|`8Np?nZ>tR3b!mEG`X;`-_;Ewy35pt1vtDx|VE;CMbwapS1ZbKVdLj)v8> zL}VnVG6@>YsMfp5SNL#lg)BRWC?x$s0^?b{S#(#}6RW{2l^w~ZK5Aa@N;_VFHZ9lQ z|DJ_~MBsCduU9%np(pyAi=0duOyL^N@_{wxI9n1IwHJ1KKNedd9yPrnHWYueBoxaz z<7sDCR&;;eu7&b1N;V;( z0e(cdJd!-WgVohAquv$eO{eSPMOa&3-|qIpnD)75!-KyE1dz z*%%#try%mo*Wzx`%2nON+w-qNF8f2|$(=J^ac@>uR_^q8y^AuqyI7ZsA=fa3_%1Fj zNsMHJiV3Bu60nMSgbRxPyvOQjlN(7a;EpGCb} z)%7Jv>jXlI*dKb0LVeQMG@({a0_;$^QJr&Mz(P{9dp!Aye;*GDivxNi;^xI$hp%)F zc9~dgD?}t+(x1V$n>xeQ4tAYm=CD#T3F?IOkB4}AV@k;NIg%53Maf@uMuo?BZC!o? z=n9uXF%k2?;GlUtXVMsK{z^IhC$iQEu3=?XVYDO*BlAR-u%eRD?S0QZ0h1*yEwN&K zQYD$2>$gTnr?XCiTZ<-K|B+a6}k!(M}g+}={+QCWdnUf564m$ zc8;$*F10r>Z8q~oK9VXn(g6P6#a{ZEDrBy_j3Owy88A`L*Yx1|LJ-BTc{$Ns2TKEM zChC*Demm*t#gOS;hU7YUeQcan)G_AcuTr&#^!*%V%~zEqO22USM7RR)EKrcSX{LDx zUoooImhKdQU$ts13pEIBPNE$a@Rc0?qB?G5*jp~UdyCPP%-fg(_^x5!H2MB&&?e4H zKXGJtf{BIZ8PY{sL$ce8K;wKh`dS502)oi0v~jII2Q<3NW2O|%0j zb{owE@SYV~QWPi4%`)ZtfvE8Y`UfCf&%GA8glwZ8CCP%GgU{5dorcW#D>7mQ*-zv} zn0iXz$oUz1w`hj?-fp+V7~z5Yt1fDPZLFr;_n_r?HjVQivy6hdj6nBTOwjmg9&{1h z_Y`jc$Ongw1y#o~31_~hZ5VVt|JJuGnshAiRf<>}uQ$(C9wvCY_?!d>@d-Hy5^Wvr zr+Qq~IOA>9>k@!-L}1L}{pW&H#*9H?q%o-Io`@&0qEwmHPqXOKkc5ew%h25+Jwdjn zW)ehn^;fYs>Dc&7LT^s*_IEwAT1Dq{n}I#OC1pv<8(W_$j&Xf0@luL}&N-N5MjQ47 z8eH}E2~yZftvv=J8d3wwr-`zzbebLAc0&oOF2rn_EELYg!#x~d@qis`)tBerEpz9k zm^hYBp@7L|Hl@-Clv_4t8u@>HXEmWkysHFEhMHQE1zH5_7?`bPN>)kS!byt0K;Aey z$Jo;HS{|g`aLqi7yAjJw0ZNoz+v`VmTc!(^%lIBFW5as$A*5S)^SX2gytf}b$z|)Y z#|TXk8o45~vVG+_-)vs-xwt#+_vF=CyRV_)#M6GS%K{5u;PJ&~KKg>ww z*Ko{W1M$c{UaHY%239Hy?kqrquSIo-D9ikrQo~YqBP{OJe{)|(Vqo8{Nmp>bu6+gd z!0@G1Qo1yyOFgphk3)`>%5>M;3Hz2B)0D)8my#Lk{mcDa6!d8*5uVhID-^ZyT84 z;%8#$Gzg)PawuTi#kS=5nko5fz8nG6i7kC!TA98}m&D7I>^&8OEW|oP_H*Wdv1-z& zp8mKXYmI2=!QxFi$8xt!_HKw9v{F(%Bdngka(`cjUn7h_U(hn1=J7Am@Npniu<`pt zOVHBuT*PEk2YXNT2g0HRYxIG1Fa5nv|KGoz&+as?{Z}dVlXG>^^wpybHeEi{G7OWyisVnEbEnvsAITV>^zlT{Q7@-Xocw z=ufECvT2Qqb!By0$c;g^D|bIp-xW%+AWxYf?>KbzcJ~ye#i;#QnvEv-q`rh_=u4!e ze=;vS1Lx4L;&EC{1jlEM)TR6YW8N}hnEw)VA3Q$hiPQ8xGHsh`$3^KV1kGA>|DsYT zxm+x3J0Sr8VK=L}%&k5;es^5bsy^HNQ7<%M<8W+N9NlR_&~h{({i?3cLQdnRfAYEc z&mnzaF&qs;pR z=A)~s>umuAH+etBTgmpFztCTC*AfKp{V##Ec;uPf`sOO^-ty_(n$d0Z_mwv+)UxoA z7tUVJ=T%InBEqK`s6Enrf*R-6PU=gh^uSec{EaDlV z*~=PQGSyw_|86ZCQI##3Vl3&7##qjLx-j-CS|UYh`^+_ldgbF>dd^+e*ExJt z@R{$pfIOpf-hfDtoVB1vWg{ZQ>A$|pO&5t@#*3i_9i4%v*Yr#VNr6)1PxEwhMa2kG|VKNY9mE>8M zo1wcf?W5{d4fw~%?Zmj3dZ@~&AX=t4FA47_ingc-;um{h;$v@L?t(Or&kc@y8xmZj z&@uuCN@hkR*@GTOAhHqoS|m7CyPYJ^K};_qi#o0<-&ywq9-ou9?R4@v%u)x;vJn%} zB21v{+R}+D0mBm`gZH4<^)$o^fA$szo<1!%qoOW`tCxm^L|+uZM!DZ=3=r=*ys_$R z$1Wkk4CbUFnIByN97x^xgk|{0*6xuKKD`Q$tp{E@f;m<~u#qGiCk@YtGRe1<1~m5@ zOxx=kg<2`yf-U&e#5vBWOi~$LR_qUD#EH(1}=8Q*?nby!8KEh!> zMnNw>7xt2gAv0tx7wC@?d4!S@18bz%*2?f)leE2Sy*W_tOS<5ZezXHK;+e4DBf0#{tm6kD0*dShwPZ=d{KzK2E$!B z={ee7oKi5kg0E_)CGo2Zf^$$saHlk#>5$2=5@v2F3v|)e;Y~G^y=w(5#%gG%H-YB3 zww_~Oz!iT`w!XintCIY1OJjMHsX{XcOYpvu+cpG3T8vZdP7;F7>mZ$`s_Mnm^w{az zJ}+(1ZF{aWUX_8Vcs-c0`b!#x2_EL==5ml2uc<#2Q@L9A(`=>NYZCLe zq2mKXG6BzSy$(~(o}XZmBqLj`9Z{vpAFU7OW>FPS52K^`nKrKNIaaJ=RQj<>TBvn3 zt4w`z9hHVmnSe|%gn2Cc+ADM0=c?V{H%-@a6;wAoR?-2z6y*JyU zTV8{Q)o!_{(caZVmT67p4j=kbpu%jkZd3}+9*9it6&J;Bhj(&cJ0;9Nzq0Dt^zX7l z$}z5C@RDyh(<$NR`;nlCXX+-39xaoU4Khjt~=|8@g@jBa$PG z=8nA?_MF@c*j+P>xvvy0z7=6wlFzE1j=$hY4UY>8!i8GK)HqAb2}ueCS3iUzXGbqs z?9?bo9k)=FVxfEMXC%1$!EGzFsLxe4Hh%b|@uXFX5EH8vGXpK*lUFp=N+=~PCx`V}92VV|_YK=MzI^efT< zo42d-4;IbtXo;Am`wbO8zJs(;6@qB(AAr!uP+aFD&MGO-3)K>gVwEQIAdQ9i@RdTS zg?T0afn$qLlGzpQ;lg73V!&lm>WHvs@4AqN8V%|FTX__VU+m4Rq!__4XX!`iajM-F zg+VR-Ch#^tC6MY%(d`EzI7kkn^LBTM!;=p0X`Sg#qHz6QGc?wX8$fNG025uSTw@xb z9yn|RHkE5maE(b2s;;@7HxB12x7Pb`7SZx0wf$w=ZcgT*;rV^tZZ!aene{DK!6xk` z=7#6#A|-fR(d4f}38mD{nlrCOdiHqel98bkSH~XYVJ2{h)eJyXk%pbO0vdJ|*nC+b z*x*{>C%OyT^YT-}oX%UlKgsl!4>M?gm-uJf1hohAH=P3?%}Kiqwc|LLOu+X@NXpTX z4^lyT)_aOhTJzQa=NYoS>vXH$`NG>t|3U-NU8wsCX+xGGZ@Zy4Im$~MwU!W-XK2;?p7%iRA$5j%ZTNY!3LVolOU(l;HN@6(Vn^8=CjE-oU`waGO zmT!$;xA)|qGrN>pRv7oPT+n987j8Jqonsd0W?{++W;}FhJN}}&(<#t9;5L}2(`St0 zr>TqQ6Gv_A_*4->EKup*bursXld@!XZYanxJS4s_nN;#z^*-HB57qnEaXE&bL%W?4 znt=xXyN%EfPWM$v++d%YWi3pt!i8MwvnD1ocpowWoF>tvV?yWpRmPvinXQBOC)U%n ztq`S3B((T|s>1pA3?+D&+AOER)5wA!G~^-`pPKZ7N%r%*S->Vv2fuaH-ind?bsz3- zA4Dl@DZFLEoj+C>wSm2KnilNU+@whqK%x~CVakYDh20ius?`EP=o^Ej`sI|$u|62( z2CsrbwS7@Gq2pQ%S*njh=^UiAI=0!%$imEDbs)E_AB9KFVFosDY1cI8R=v2hyF07< zbRBTbzVQq8NSnRC&rq%(WR~Q?oi#b7K>D!N{j1V?a@ljWB}-sg$nVpKp*tOK)uats z0^7b?W}*n(m%pt9dNrpyqlU&Z+;%r9NxK$>IcKZtH55};fb=O8pFqZU+TH(%OBZKh@m&*&zcDZNZo@SE%v7n)2)NL&Nwhs2 z>#{H}Gn4p1YDTf3vFVt+Z5eaHQ*~*`%|M2)Lpg1r*&{o|ecM3TRf?NE*aznb;mFcJ z6^|hUEo7dIUs9Upvx1hZl6n0T;IBLbiK;H04!irSA1XUQD@CxGXU>)4xhuLZoxPu< zB25T6G+6uYA4mubi||lxg%a47U8n^OLTljr&I-vQ-*@hd%|KA!5;C4AE!4O}N*U7b zcNr~e!rvltza09`3YHS9s6h6UnuO5t@{|2NQ&aElId;qi1!9oVAf;b0&8fGV#dHzRTE(`>>M@Sh6>BTZW6~5urZ@X04}2J>dQnl&>tj=YdwBOz>K)x* zAXV3)WbT2UWFa^z_U-$xrD_g_Hv2$|5uYeYXtK(OfF+xFTLqtYliK)Gga(>L6)1|l zU)PlIKf)>k{GYNcWBg(qoPjVD3G?%z--(9d_4%dsgbE$&KK7QvQk=D}t{K_%Ta5yE zdqnZt2ZLingC)(^AK~^2cOxg6l`{x;Dh06Y8L*^!%P$3HMXF4C?;J;R`74Fb-bi3@ zH)9iEA17$PY7@(IwzeXyoHyrvT*C`U?*00d(Bu2Gvaw>zz=Xtls>gqICv4Mh};n{}`UCZ4+ zx`j*QC=7oPloQO{3U(i)7HlW&tc^#-zjVWYsZBP=YxVV~N6Xd4Xq7CBab`8mN_aTe zFJ`966)%UhKYa!>U1(N^Gz%B-+nf>O!m`PC<{<0kC5cy8p`KL)w(p2!;{Fv zod5-z^+S84Gneu756{d@Ri4e(xKUYhVTsJ|I&f=s3%tqSPi4Qe6DcOX=38Z|koRFH z@Zv04HSdJl4@4*}QWcDp6 zghahXSG1+wh$-*hNbrm@qQbJi_k{E6tRi!3e`b)1jK70`Q-Os-jp3Dgj9!!79o~KWa zg>cc6WFa>53}?&JN9xn&rw)O8gB1@V1M1`z%*!c*s+*~RJxpU}iI9U&^Dgtlc0sd^ z!B~j0SV;5a=I0r7bhiGwq}sA*X^4YoJ@Iv*ArE?aA@)-KV zVcdkUbQz!vlr^(E4Zx?DbhvH4%7@^?b$8d+N233!SHID>x8clN5`G>01{u@hy$`!wkNlNB`8-&jX zLYur{yN@#zE$^k}R&vvDvpv`Nv!MOCOO9@A(wiw;z=DWirt$3aj#x@|-?>(Vy)xMZ8r=UNoAW?f^+VF@G z`hn{A<`1(T(wRDiVVvRMR^fuYaXA9iD9ZU3F4a7XqZPA&4c~`*H9_K){qt|_tm<;7 z+`_`#`jCYb%_)iEkM<39Ov>iWTd*nl$@vzO?Z51U+t;t{oS2@~sWQRk!jDIT(gZvh z4<}K=gbl$Q6Em~-9Sp`kCFD61jbe$T>*FZmQOU6av6Bi)1_UHSH?M(=g&}m_$27mj znN4?_W~4@r1foWrKbwsRMG|&st6$5v?%daev)($-NeC}r3OU#??ZML`Ix+4;VrW>5k134;QZKbkE}mf;fafNH$BveI&9@g8JV`cb4I z3I}{CHu4pmzNnC?~7k>U?w|DvNFDLw%S`>qyAB0q)m zw0|DJc{LmoGS*Q^2sfn&?~SZUu!owNZ_^kgo(?C%kMt6$0{!9@jtS_u2Lj@hqIK!N z(IXxLZR5Y(tp78L^bdN{zll=+t@uCKVE;*d`ftVm;Ew%U$v?#ZHPh^0_5Nq+e{jeC zUBUldys7>hQ({xPty6DxarQ4r1_Y3`?T#L9UxolYw!mZpeN4=9EK;HMW$(F*0D#04 z;C=TB@&XRdiQKoQ{vJ>EgZALxHB+ksNVU+>9_q~Ml+*#3au;O2pikg2fbnC0nC|KO z$zLFhiNzA|o9LJUwNHHrYOevU)#`>7;cb40ewWd7X&z`Hmk->NV>L^5%-B5wLPC-S ze-+_WvUOK(=amP@Q@TvdvwkT{y}fM%qF_(kPg-$6<&uejA)#vVerPvu-!d*%WnIB= z)Eu_s+H_a)+cd`oXobi~wg5mHVrGKOG(>y{^-x%n{(W6>$>cs0s!YKfY+$*a0xQJ6?{L>o+%x00|*~3XtDnY5rx<0jl{5r=#xL zv{#Eofctp1zVDt#w4cT@n^I7Ld*oNXAm6{NCJygjJJaQ5Zw-2T6gyMG7m@u63Hks7 ztL_E);~8MOY{6>={U65>*~HmIgVT2Dhqm^a|f_LX$5eG|2*By z_XgNE&nrETTDP}kPj?%6$%)#!y2DRKymS=+65!trD|AauZP0@pGw*D!uB=Q3oL5pt zHju)cz!&6AcyOCXff@sN*e~`k?3i0D{8M`Cf13)XWF|Pb9|l2KEfxXNP&u+VIY8#2 zNm_VF)Ew!uE-Vuli!7_I&Gb>F?>Z|+0bKTMh4C_%`s9uFjc)KXD_}vY5)wQg^$M-U z1FT-=X&Tp2PoJi;`OaskOZ=B{w>HSk%*#xi>@lxDTN^~BbP z>9aoUGc!qdwm+s~IbB+JLNek14okO*ytqz14~+y-b;*&R10_;3Lp8vRQ!KSKaKQuo zL%w-{)+J7}MB!X_0}KFz7?Iw03GLBVOe8JG@@nf#81Y88j=4)(ljg9(gCj(MA?Rh} zTG2c=5(kjhCXE30QLaYA+$xS5wdf}&FRD#+U}kxh0cb}X72RK0W_JRZymYRT1Y~4H zWO-S6c{mCbUk0v<381$Dl^R!9LH2NL*(^HmLVy&aYtNRU8XzTP21L?kRonKhe|KTJ zt+bhG?_++fRn)*eN6Q^R#@nh}ePLW0^l?5}@-$DGiB?yN#ZvQ{FbRT( zYY9CZ9KOxVgoW;s1kvjmAF{Rkt-h_xio0uICIQ9=k?EBVr!ga=d8YS%58{iHNq<Mv|OoXQ}$AtJ$$cZxZrq7^Ib) zEK;Tv7j`v9If*7E=Lod-H^CMp+?Xvdsy}U311?Yv6-|Ck)I2QIAfc{Vd)4kBNR^g& z37IV;-tU`p%S+bgoxS;A087ygnMkjtEeZidY07b&pAu|0YzRxVfoKSW?_Y5RW&mb z9Wn#%`i1(!x3kpBnewjUkeamSC{61Zb|4hEzy?G#c>{{s?PmS;x&DM!JqP%-wKW?d z>%NH}*KaQiuzRPA(%bA`vaF1k9Xg`G!G!|!T>}d6P)m-xR1scw@!0IvnT$YGlhyWt z?@a47pU8)p#_f3um+vh2N*vxF2)nHCnrMg>_gqN-a;_Dzw$DyrXR?s9J0Q~_*N!yL z@QBPEn3avqx&l?l(QKrLGBzju{az_-!-rZiIB|J$E^EkFn*51SU@f3?ZJz3s267(K z7$y2bs(2q#4GMEmd4z@WmAFO}Ou?_4)44pP=7{7&#cT0w zuO8T6UlRK0)pyal%F_}*8OUyK=JN%fmemi&QvS8~H^%%c?O~dudI^6r+tUHBD1x+o zXfZ4Do(aUog>^ZC)U(aLk}?P?il+&7KApnYbvFhU29c3Kt&y@FV2x@^r?P3wz+B@g zDWQJ!)t}X+KCZ7MdXz!bphZ=!`-_{`D*^M2F6;|9=L+ql^MwX+P88kR-l=F|Y2 zBN;ut8a^3P%)j=lU~6rQ(_nOQ>Gnhk%NG>(ur^W3!^ugo8B4D#jyW~M%w(CBs|oHq z?Y=467%;0T`1z45I)aT@pq;G$cb7k>r|Z1_T}f(Sw$8KXaYg_8!{f$dCG;c#Cv-h<58nsu zv1ECoV%<9gxf}xKv^4@9e}m|ZrL!n*ibY#u)OvT5v2gfm!$ZySMni49*8kVgiJiV1>t<(l#u+-Lyx^ ze^<3j51_$Cu>{c5_B$Y-JptUdnp6_o)$9UWjq&ehb8*t@41$!|yCxX1j>w4){%z6( zADi^E>D|c4h|Q0FZ#7YzC<9rDLt}ezg0%hNub=B~NfIT(n@Kv4w-IE4oKtq!M9>4If;}ZbO&cgA>%`5C;;(rSNkE{NkxW`u#5PtmBxY0|KltBdD z%~WhouX_Urx5+4iNew*0H~s%|uR=iqY`#^keHpZK=s#<0wZJkG!Fx?JT2gN0)AecgNvi%vl3RSgv;Bg ztl2g=)4G<>y0Zyp2%wZ1y-S0duq$8fR#9n=JxTsY{~h3r-qtoW-0S%M1U5RHSU`2@ z)Wpnt|MJw~Q7U(Gw_I#@&NrUdCNoK0os{1u0Q2JHaxHReB;eeR*)J(`0r&Fit(UAd zP-V0uWABPE?{c#v`+-VUB-xA>pIYZ$U=$UP!LbT*LM@Qx{~jM=5d0nKar5DJs7pzx zQvC`@1GGy7%!|kfI$5FdYu3Ld!jS$Boc|ePz@LC~0bHCkc^(~le$^Gdq}o1nSb>+5 zg&YfgpR!Hq>Uz{a88+O$^tCuCHm#E$POe42nvXlNK1@@lyrA@OEctI^S*nZefB ze|P?<)2Wrn>>pI*3ZG@dD1LGKV>?XaST4#mxz1S^i-$bzgPe;{FIY$?3Fb6c=Q%bI z@N}HZk{$w2!?waNX5CRU)3iJ;OfCLo1w%xV{KVH_Q%eEsu$UWQg&8b3)MK{;8*w5} zTXk47GxYFh>%wk~;5H{F|Eff+i*)BZWJvd0ltad}6*L;hLxJpTmJHAVavlBtbH$Qe z3J%h{@$L(HN<60TGj;V_60A3<-Zl^5g@Vm9xSXt*`{76{rLei13SM1lsj-HJ`aEJ@ z=DpOFPy&uG^Z+gkWfPm|q7J_mZ>#yvuc+mcw~L{nnWOud>Pj@VWaqL;0k_H zPjL%oGrc`96ndY7qB`4-?!I3I^hLtx=rH~KxmsWFI9&GvZIfbc}6?W=8SxiutNgwvk8(C)VsnfZrOK;(s#Z|_R-YIC3Kyw+vAhm(O;k3O1- z)*ceXlAukO)?ZS8kTsV_2BtY~w^d28$Vzs^Ib`MaobNaJLhn<-4Y`t`m z_r%29PX)g)wCKlan)7Dz%V-3roPu5-`DXQ-mpr`1Uas2la zK?o`!7THxkc50BluYwphL3-BD_27(+1OZ7COVd)N4v(>HEYIX*!7qd+YWxA%^&gf?MJe&41xOvVy`wdYsLzOUy66^I# zsY@> z{;A!RO%#82_NOc@IW5Tr@tNuoBu8Z;bK21&(^nSu!X;S`DF|HM*^9;`r-zF;Xv1Dx zy6hQ)C66$>OXCM@xl1XYQ`Gc$9?N-pla_>(Ba>(gb|1cl=Tp~MZfS0AY*-Vt+MXWM zTrf^QCGb>x&`hk8bbyQIaQ)e<)@N5XhU4bMt84=B($dx&8Er1d7VQLA-9c!jy7v3e zRlciE{hd6+K*iSN^a%dlLL&cI1Bq3xX&DV{*)C2QXfg%>EFFwabBAK zaO;lbYlWviKJ3wQ$=KM^TGCc2JPJ?ein&f!4(=2UZ;GlPY(Ee@t~{CwDP8t>E`*IVrMQOhYttZ#*#4rGuy3mlPv~U{8elZaubAp$ zWvO^IRr0cwwvJ90TE#7f7O2>rVr4_|hUzKPOEt@}g?r7X7@@u9r6bDr-c&g{<1PX- zKOYTn$}1@h-|)$DQxZZg(N~5UkBs#*``(AZv?E7OJBcin(nLQwI^QZy)@W#c3&vu0 zi9R?wij)XZIJOfo<2(GdAp2M1;Qfv>jJw7Ek^yf*2z10lgctD#GvG-KzL_6h>LI#Q z1yLI(R^N^PE&hVzvI-Htr%J=Dt!?e~y3&?>ltRZ*Ys|Qf%2e2;At!Y?z$1L0@-|-* zB47(u=Hd3eSoyiL<21N?==-JAKKRzyEZq1GyX77=VOF&b>%N{zmL#V+&N(RdE$l`zd8{7d4;>s;#B9w6x^o(mtmp;wqknqWNMTa#X|x8rhA^ovJ1Y~FX*Cs2T)kY4u-V(Rsy!u>`Gk@bVM;j$4(q+K@>o?t5jOfl@1s-j71KlNy~HWP?ijdDHptU8STf)qIc{BLiKw0ZErrmc_o|`p-ptk{_^2&Yhe9W4 z`oINu9Av>1DWK9EkngEznFYOGabH1uY4<2l*uvm9<=cgcVULvrWUq1}am^zX(aL(c zmhl-Qi9T$ckxj}($aK|cWdz&jdqL(4og_sTmwW zNB01tJ5_GZ6IiH=WOF)u{w>7eI|*q?{YAkXTsg5O;`S1_gEHlVFj1k-_k6ZNCE^6U!s5Oz2e-@65m1Url&#Kmjfp0KN?jVpO zT?)S?JY)~dlBAZIf@Yoq6kp6V94hJQD_BCZr+!Ou!bqCM-up7_5*lAaqDw|b+a$`4 znP4OvGBGKMct1i`KW=W{58y~g**L+~K^C$Y9 z4p0kzMir{IQ}VHMuov`%?7OYH`-R7#U>we`Hv>P`mw_+3N~it6+_Q1llRV5|qA_`dWxyUS9?>w18|g7my(bEq z+JSCVByB+bcY{w&(piWvY*Fb~8Pol;zi_C2=qFB~^ns!`=-0wa`i)czHLsr(ee-@m z+0`AkzDr$V1fmie+4gKP%dp23;!qNsheo6BdG3>;dsa+@L4k%?4>EcL1y|cX2vJj% zbX?B7Eor-anW@MKM>J#RXG3#2fq1_Pw`WJnAPb(RiIdqJ1F@p$#olrnDfj9NZZ#E! zbGr$nO2|BpCF33ubhdI&ev3fMLszEorFE8t)QP6m+uzlR69hK{{d*OHWuxlx_&%Z5 zN;dQG+~9n9K%j6DLKAIDI5{m1yPRg&N?N(D zw8jY@ag(sBwlbSnV{Wcoe6bcofT#h36GwDn$yOf=9)Y5hnas#-iMsa%9zOMhT>Lu; z;7@4j;v5bKwc*5|1*eTs@?*cS3GN(8U2SNR+~RWkP9rK&__;fcf|yXT!2undoOCDc zI4wNcefJ&z)uG&isHs_OLqhg zbJvTX^DUx>Cl}~DI^Lf9T%kd7RQ0ljW&trTOB$`{Xwuhf#q$$0SUD*zi5Q1eH%*#h zQ28R91|{Zi zUSB u&}e|FBtoEBK)$#0X=(JDQWDJx@Yzrm+Hwm-6HS0!EHBO78D@6LhgjSURsG zOV0ir)c5y)Y7j6QDG%+QTRWc4Zi_6JmCv!qSSAxGDaab!>7txU{rnJ-iO==Pl5PD2 zp4O-K+-UAWI)!C!f05bm{u9x!_*2scjN;=<;46ST6sQ}FtD&yDt>1K{+L3YNVev4d zd-JgBiIS2aad^Id*tUnH=jYSw_gFRAkqICl=rF99u|0mpFmnm*L1T@xbecLwNfWtG zait~R#$R3cowS#o8Ju|MW@Y>0Ur4WD5{OXSEb?abGHV^C*24(?9X?fWXw=NVQoI!*@$rfK1ds*#l!ELX;O zPBhtijK69i)~r1J)-bup;|yC1QiQa_bhNTQ3#^8)!rc8EwWT;@PTF@Dp0UKc@2_z@ zUh#S#{7%)O_%PJuOE54rFZV>Y+&uuaT7|iJsD+2@7-u3PK z*Hh#cwaq)JjK4`8K45T<{op=k@T|Cms1VDzn9D@^3w0?z`RA;A;$e88D&1qstZQU} z6!1yWudMS~o!ks~l>HUA`|hSs5nWedtvPb@I(|QA6!Y`f7=V~58z zuz$?z!LWgMmGHN@9eqG@wF4lplhHw2?%p*OmKu=0+&&<(7S<;X+i)qpCnyqJgVhz5 zN~yBW6sd|OQi~zHDT|RiEjH}e>8wXhafRZlK&~^_{XM)!94ePA)Xz1k>JhvP+8zP# zm&-6A(oWND__4!l;;u>G&mZ$dtE;EsJ{gE(!3fFXE58-udB$EjN1dNk=yjxj=*?kF zhZ+VrE}S5bBVWp7;P+t<$G`FeR%k7u+I_On5HPTnYs6*HKlC@%Wo8SK+B)4nhdH(i zTH5P75mT}?r~3MAx$R}X&2jEGbYnNs!*UI*d(9FA;W>gkC(29fLqo#X#)ugoQ&U$@ z0ll^v%D9auSKfc0_7Ia;~P)N_PeDcegbOhviU#k<YaKzc6KMaHZUTJ6$&8 zG2cjC$;$N@ciXX$Yos_*PJUq2MLc* z;*h8Z4kPqITSORubFtOFG#Uoe2&`YNdB@z(HCZbo6)yrga{A<+n?v9Rz*JWJ8 zQ%Z7sq^`UJ0STRDk5Jls;50yC>`R=DBt@3meaaH^idW+qteNPoS*VSp@cT2qr8i~N zqZiL^tFz=o@$#DajC0J^4yBh7=%Todx4VNm$7jg)lML+^}b0))l6y82&bmSx<6-EQNCk) z8=6`deF45=(@*8CpPN3lw=*>@t0_sgdGU1%-`h`>o!`yP=W*M@1b6`KdI+%+WEH_? z;f8ezW5*spBdDQ+O1>Kt!|N66FjtnlOTvML2RThqa#61`-PW%@7bwOQjXNv`*Fl9JbM!hED)wQguq<`S^jFexGd`HBaLngQ zUqj|Gvp$4ycE#aDqz`IL#gqiAeI=ATxD&zT{z&wq9akV)z9WJiP+J7I!ww8}Hp7#c zU33C&{A_u-r|y$lu3SmT>LVR4hUjU zuxsXN?!Vb4;%Z$Rl5GB32u1%JFs6Ne%&`R{kwxTaq<+GUgXVphTTB3i{ofE^ncJob zg@ykA@T6f2ZS7q|f!QUX{upTWux3!_0j+?2BUETP2hD#=)9u1ZZOBkp7ZTLqZZq6v7_9-#`)3NC<`p_V zmY+gi4A0IAZ~djN?8Xz-oQjo*i145w0ANau6x>^$ zHmvHiCgZ|2NxCO6&EYn%p690KOVvPI9Z!Gwtp^VW(h4SwCV?n)Y+ZJ|2&FFSNECFy z4}Hr{){$jDimnj(ez3!xM7ffF*wnk@mU;k!b=h zBdD4Fek^M7s zT?Gg+ttg>ybcJ-h#DL!{!|RWOfZAM&fCQcBW6rqXjALoLh7wkTx-s6X{&Ufrybsiy zjZI*ejS4+8VRdzS2O?}tq(RH#0LtJNzdby>w|7(b0jjv~Qe%4l!?3k*v>`*5hV<^Y zI6qyM{QDeJHa0ae2vmu+eC;m1DQrccEUJzz_Fj{}3~p4aN|!ev8wnhaq96*r>0_@{ zV!5i6WTRenyaZj!__U^Q1D&gwmFzwmiqer%?%KT<)oBwO8}(Wspybaimh29cPe@O9 zj*$c^M9nU=BF8;J(GUXvqD632vVKQFt5VY(5%6TwsuQA?>~hW(V4(qhykGMzMuta`ZHGRAp(pMaqfHp)T;NdC2 zrfcqayKk?ZyNO04wSMN;nG&fJVU?$ld8P0N;rPifJ`r4XH6`8vT7EWEeXh0PUy5XZ zw`!%`80r(z)*60I$T{R%_3+U!*t_Ng&OW8(e2_#24Mx7c&Y$@?kPDH-(zU}Oc?W69 ziL6ekIVV|Ed1Vhbn0LXS$E0X6ZTN;PI%OJCqb04(|OXGYdPd=h(KNBzCpU);CXqJED!=qs|)p9yL1ibMBRF zD+$f|v!ZjGbP%T1SLjV+I|}*vyqBv{4dDDoDT}3YZHk(NA{rG=D@LbLnck9$>R^Vn z>MbdYpPVrlLlU5rqI_&Q*ADieIEE*x_^C!x`zy#&}Dx)SJkirK)d15i1JSnPV6G?JFg$*A-rO)J`Tz9S6fkce>BnXI~{Ys2p2V=o2iy(lxI8iqmfIbIZMBg>HAj8 zorur(bWGrU(f&NgVlQ(!p5D;FyG{rI}4-LyD6aD1(RTS~5CY zH^vCgHWR~#%Sp?QJ+zk*%WtHaN03MXZ(>r^hS3>IQtI%)=s^<~Nj<~A%h<&tFMGXU zW%hBu65+@;1`JO<^N%?-IM+^BFpQq6e{xXirzj{w!QM$ix`;9l?LMi4(4a z08iJgmdzF@U2G~j_fnf+M zPd#63YCWm1x0}z65T@0sJH)7pV1np=KkCI}_%ik#5ofS>Zc1~`u338-+8vaTf z>wro<;JXSaTJUEmYD~oVQPH@qbYpK612SD1> zCYeyv81Pwd+~;0Bv89Sf<=`9_82S7Py@ea%*&D zn;i@99he_%$=!$mCT$lBgml!ni(p$b4iRgLLWrTLvHZ>#P8nGZv?BB!ms+ve4|eFF zMv$))Q+4mVS@E{1Cr^S({f_Os^Q;T7m7)gJkJu>hy%+wrj3>m|ySywV6Rb_==m{oT z#P5;$QYWXb0F9gQ=NoXYbaW-QkSIBtl$6$`U>Ob}Gc_j%t*+@n*1zX)J?{VH-uv`R@>l)xrxTNbl9XV=5( zP}Z-s!UIU!%bkZRQ}nGLHo4k8E{*SF%2dQ&q}QGtTJk92KS&b@CGKNTy^=^rAp59Z z{<^Rt7gOv?iq(e^2EBDgw$xJRUODfDRJV&)v2N7{mRSm=jf^80<@HpBuhsn@T;-u< zjC!m_7I`V5Nx4GhPuTA9zRESCYv(?^w_bUk9XGbO7>R7{)^+uC=1Qp?`qvyCRW;=H z&-+~*i1qdj38qG3g)cdc7)`AevzrcgIm~~WSzOGUC@e|4*vEW7KFutAM%IOKAi#bF zL~H{!b#0UMm;tK|A{q&oH2Ey2ltc3yj`$Ov@nhsP@-GUqY~1({j{5rtkjU|i^De)A z&!TvnT{W3DWbEcx5lK4V6jkL^Y*d&-9oEZ|r8XX-tG4Z+6-Zkb$V>S$bPVsz~-yaUy z9!d?;T`TggVPlkXHn(@5y7&X|ZWlj_F+N%EeM&%X(Tmj9cEu1svWDS_6UV&M?=}0` zqIV+F>fH3Hh$!CXy3}DmaC5Kx(^KuVDfgly_wd4Q$ncqVLj&n8dh)DZuf^m<3upf* zox6onOUpHg-57a^(of#!BDr!M&DC ztb1FK%KV7-MJH7Vnrjt4d*lPZrGtuMdOUCMBMVly1-BPZ7hC)SkN3xl@89O*OC%GV zS}s_2d>bEp7FKY+bw0Q3cX!4e%T{m*>964tw0yd7d{Df8`QdL$F5~L~%ssA{CiP27 z7Qx{cEh|XzeGaVcepCER$5BQmpX0a8O&H4cG9E`qHr@kjIr2ADkh@0bgA3I64mZy; z_n#E-5uLTe7%r8t(6>{y#bX>a^D}7YM>z<$q#WV%z6XOkPNmdzM04>ciYcnm$W!@4 z^6veQ8v@jWD~C7%#FGPqiS?<5$4}39#<$a&E zbl{UiZzGf+n^qUs>SN$1|Ds~XeM{h04`YbnSt!Y(^Vt=p2Q9{q1sl58x3+ExyYeO1 z_Usl>Qa!c)r0L-`ml{-?HzQ?oL$93jLW=J)t?2__%;NoLVGd#i_%D7prz8ZYhOIQ8 z`V?N!2A)~bc$T869%fZcYY5aoA2WFp;pFb_m-Xkyf~EZ*(r3JoKtL7Yz5 z`wlGBbhWfJ8cinRA$Mk0#)Kv%(3B&H6fbW~d*x+GH=iC)7Wk%>eRU|&_130I7Kpp~ z5PiBOM>+)H6+UzuUCFAiqiM8BM^c;$H3vLEmXPBJtR{K?4gPie}h=;mLCs)h+ za0zi*pzk|z#(LX*Q_LepHU;5+7|FQI}cWK^VHj7qZxyTB|ZG zuj0Dm?K=k^bdJ8pvpc_zZnCkUqlCY(L^jB=(0qjY51{0Kyr9rC*xUZ`f|40gW;b|2 z`QN~q`Hz=>9{67zk2>N%k3UL`Z7XtjKdi-rw?ug|o|2HpZ;2h9Os2)4lUW#f-8ibz z$SZ?~0835Fduaj%DpTZ5bF}ixL=7js`rJ;6=PkGe1i78Ic_~kKd%ZILJh$I!ZlZsU z@$mP(r>rHlC8aT9^}q@Yy_Mkrvs}9DAbenB)+t2uK_lkaq&@SiWI9Ic8>iC-WV~%{ zY>heAwtg{+hVNq^Wql*M5!lUJH9p?0I@>p-xRwiX+>OJ#VTu?&Tt}S5#(oPHUU|io zGz~m6QX(R4V~VZK&3AV{K8lu2!Q)`6a~xDltRnbR8&J%T$WVR$@#bI45lju3J&ugE-^ z)8Z1Gjohjeqg$CSDpm?MyZM~%Sn8a9-snw0!^Uls>($Hp=6vyU&Z3ziI(~Ef{D7BI z&t~Q-EF)ei#p0vM}F;PBZ(WWgV>0 z78-^n2SKr-xVmS&Mxa91C$5Whb;`~j(XpfrA;)bcYB2c}mKV;2hPHS02}N>I=2(CH zPT_!+$U7g{IX+F$09euk;H`#=+m3>JgBC939X~1Ok%JR30umdOl4=X9jF-!IftMYD z_QTPUi@!K##lt!gpZ9Qc^7=%#2ZKia8D@Ajd)Qe`DYb2wjazw}Wo}XL(8t4Z?{s+z zPH*ZzfBpnGXxO?Z%PYNgdQa`}wX$@*2pghV$@g#_Y*?uGC7p91ME&Ve%h|XA$xb$@ zZF2d1^~P@1az$H*`@A(9AK%CVgZ3J_y*&cw)dC(4ttpx6ZCt00XiIU*e3JAsyQ<e>`jZ*$_?imJsJN7if}KbRg?u-_kLhG15*p0~F@?D<)(+A(bS zu3=Nuiw@NwoEwc=FRawX8c4l1dH4ogv}Y$|pF-d|s&O@P&y5}yj~W}Z*E4UAX;Zq{ zyL4-msKYyKW8Okqnxo0A9Tk}Ajn_DE@D5!o5(ZiM08i#r4--ay{`TQMYD26p`6zX1 zJ&0v>KL1*U@iOMw%hIsEUtd1A@r@}Z^Qk;vNz{6w>=T50tFiMLd?}gB+{P@en{AKV zF8j1{Ih&AyTd(s;Sn`=ma^1|#4HD=SbY1uR%_T`(I_cW*4MO#*`r9!%^lp2S4ut|aTa`xCRh zPG!1lrDOPl0rgg;5#MSzarL#?3tf?xP&a94oUQ5G6{Z{E!-g@Z|2{ZZ^(G*{+WrF8 z2u|4ccAG&QeL_MdVQrtCM**t(d=b>mH6zm_uA9)cFOZvcaM|^6B50&@5z2?EewZ*6L7!{;p~ zdj5DH*)p<@qiu8>KuIotKrBla0;ZHSatPH{&7uA$l|8 z)89RA5U@-PQT|HH@sdu8yi t^Z$?U|M$w^|2Y5u*WU7gLG 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 literal 0 HcmV?d00001 diff --git a/play/img/ballot5_ranked.png b/play/img/ballot5_ranked.png new file mode 100644 index 0000000000000000000000000000000000000000..12cc3abc9695973958b1badb6d889740d3381075 GIT binary patch literal 36543 zcmdSARdidy(x#o*F*7s8%uF&fGjq($%#JaRnVFfHEjx~xnVFfHf91?~Gi%Pp{Fif~ z)oX1@d#lye)m8P>8?GoXfdGpO`{m0Q1Sv^TD!aoCji%a>?FDN!L+kCii^zlE-)*I|Veucn#V z-VDV9J$+mp1B>KhHgQvCUy+#;wH_)}$XT=Kg{_X>WaUQBS-8_Em< z-hkZ8%mdq6@_Gj`4%ke6o9a1I;mN2rLzr5OOI>a-UnT54liH1ZK1&Puqt1OfArRm? z;k{7~P;)K6d(X8SnJIJLxc%_RzI^TM?owTPRYD>OMi!Pdzi}P|6NV-URvbb8KL_Q| z|6KfULm~_4>(C_s+mM&|@1D^Abtr=W&wKxEpfUwLA6fW+AE-tCbMe0o(m4NqDe`|C z{$H4dQ4h75kjK#BBdY?(l_B7R#yRLef7&tAMdznd-4iMi?DKnD8;+S|ilc+#*#1NQ z^sV{C9Sf%wd4_Luvc3j_39%PHz~Lh)d~_^1VeOh0{b4yBx=8j&(X4$=8jdj)Z{6JU za>HAZsxuY4TQp0X*7{h2mX`YYaALyw&ENU8V&o<2;6m5;j!7sh)hCVg#vmC8j$@2@CXReQBksy z1_w`6$8@1#kfs6OHrzd)z;62>*U?1_4$V+!hX6+z`$>BX3vLRY8}QEI$kJ&Jane;n zBOdRr=7-#V>gvj9yD2-@8XcCYKJJgDCH%a+L*>ikz9Zld)V9lOUgi9E57}LwyXhyr zx!c{$0udBJ22R!RBxEkiW{V6D*`7Bz?aj^&;nm0Mm=U%a0(HrL!O@pXNBuv)x;bQs zslpMSIRy-BZ(`A?Z0%lCOVB0HCk5lP4+S9ARV3g`acL=w7o&)N_eD!8I}UmC>$(D) z;7@tgtqzXr@V-pQ;M6y->=GgMWh1C8FsGD4NDVqF)>R(`3ryHJtb5!-U&2x>F8eT<8yjP7wtFHJ%e@yXdR(WT zUgQ3-xy$!aCxD(I`yR({7Ra}J#yY($64@D#D4KI$8iqX#6VC!Pm&f}6aB`AHlO$=I z3N0|=G{HbkA90&WvKGNZU0TJltk9hLl?%>|C0)4)wLsFC(`y5?;VbI>Sg|kJGT?7s( z{W+eQCK~m<^bZ{sy>cK|W0^QUUUJhmx-%K_m%oC-Ff1cY5c-&xI$`p1)qvVtJ~BGG zmKcU4I5t75wfKESf;3qpp5@P6Cw0Y%E}1+xSs~D*VKTk0?D61Ww(0I=X-N`ld|X#X zU}bIXBId5&NW&ss*SoEqC|rEf*;!0FEfx&CQ4MAoWMhQZ@~V&uTCJb8B|i9%I-E5) z+VTp|J{=QP-xO{7jiwjX*oLzjPm^YkC7%CA96za^8o(wsQ_N+uD+uK+1)X_*y8{q_Vlt$w$QzQLhXE0q^ zMaGp7NW-At2W`q@XDW<>0#erSW4AO5bQ~)UZ!t<~9LR65NXh0NN5WO%J&RZ=$@67G zLt|~rqR>%N9z~Ihen$H?dU5^~sI#snwB;HsO^`@=SqW260(p!w$#TI64eSYJ^Qu+| z_u$pSIDt1qiz=pedlSY5SjKfy&N?$Ocx*YDm9k8Ix@=z6*Uo%b=`#Conb_TXu2x^O zpDw(Kh-(yMHdAxv*9)_`pJ<(GNI4G0d#KqXH3WO|=9J6S(ro#7c{M96kd2kzOTw>5 zqw`zX$mh8$t<=s=OzxL|S5s-MtE>!qf)irR6LP9{3l)j6l+R*9DsHN)$G_xdq>YKY zZu}J$ykOfQD|{}vvo3Eb-=^K2lBQ0e6KK>v2`M3ATQZs3k=s;+wW^`vDI-%%ri!y7 z0KW?4*>4Eb>E7?#*{NR<_I2Yh)atpbj?iE5Fjalh)}gH@&(deaH;@R_=?TzW&|w=0 zd6jX3GBJCZy+2_Mp)!ruu&a90U1ZFC*aSWbp3wSuRz<654WAIaD5*Y?`}OH`G{Zt2 zJEdT0(1?8Lh^=mgeV?FuJ)3A~TgC}mp3kV>-ZSBYB2KuTguM4F&R>EbE#88jM^lQK z&t1KduGik)u6g=tYh@+In3LQYLq`LZ5N*nSBHMVD?YrLTgVIvYz}}gTiePcoC9#q( z-V-{4DN&u&x8VRiIx1D;z4J(g^2=j$gpn~x1S;1^?fyntcHH z&B^VzC1fjD%)bHXYw+^rH*UuJesL*J0Sj@J0heJWoQz0)GTZ4Hakx90KbLSU9XXsS zuZT4|PJS^Z)tkEXJx-g#+)Uluc@VfX8$O$(&UQ5+J|9q(%`m`RPuPJh~HubmR!@nZ`naTp%F%{a^&+8nscZ( zN(q~05iSMJXSVpwj6$T##&EY`7tCpsbQ3+*B~tM$Ess}~gzl{N_$%;>fSnbAkMt{A zm3QGJrsXjnG2!pL**tj|N`)!{FWMR#!Hi9?UtHMB^jiX55eskEJ(!d9hTyy-rhoZI z4H_h6N)<0`)Q^4zA_zk);A%T#P?g;XKCIdNojMP7j-RYcO{!It!(hk9m|y#jYXkj| zdR~ZLaiW>u0Py!+h^4I6jus+UrCCmaTW?UcQd6VUO^_G3X_AqvXNBm-pbxE}Sr^$g}d z^aC9AuKVU|ZZQl3qQ=il;f4z1!XKlmv-FSf$<}hs#LVaI&bf93TDJHhdCK-qib?AS z3vQ-dyA65Ua9`c-Y|(>60J*1%v#AU>Dg#e0gT`E3Wq=98^3{b4Eu)WUniUm7&qU}n zX-bCb;U2-)a!wk|h<1r^NM>ymN#>+5AcK~fO;AQpuf#}0Y#PVUG^d;s)?rx@@-PZ# z^dkE{2*?p8#C&%SD+0Yhm?oEYSGI57aFGmMHPMc(IuOO_G_j;$`(qrY(R zFR6(dquH=+gm2FxJu7OJdCz8X+W|}zqqI^%i6D2Y2pdpU~j^ z#%XM9sLO)?o%(ir9m;F;IYHoECWt#!wT8WugcvjMZlq?YaD!rY05vqI2xhXtwC17=B6$|(p zXg@wCyQ&-c=5i!FpLW4G?u>g~&)+VlxPwuSXeY>+lD-%10=u6*AB_N{^5q>}MCGS5FbO# zoFaPPzI??DGnJ5$g-x_hz!jFm)SN_~H^~P-ByfgtbM}6@Lrjd8`_%&2hkb*j))1>K z_VA_-z+A!!@^flbF^LeV5{A#~re~O8BK!S4Vf05)96h4KPp=B3;k*$XaZ7?#o-*Zv z#Ovck&GcPB@k{>Pz4{)mnn;bQ$5Ei{{KI*4E295K=e3vXy|BvI1+PXFTGgEO+_LMW z(Ni0xw=X16k! zIl|+6w++~wcZfwu)kTKPtsq;$!12w~*Bau|Nq;NWJeXbjwgE4LIY%q0wbfi*GmFc! zYb^!O$g(yYgrD%t7Hg+ZfUQd`x6w2hvDxW*n;vPD(kmlXb9izXRyv`^wJ01aIr1c) z6c+=E?Hamp3nt$b$aeJW)HQJ|H0O@f^K-pk@5=R&|L*K^wlt3iF``Pj$vR(9OU&UN zf5px=703-$-&4!G)@R|0;uqaj7U#U~qQP|Cje6F?ab<{!u6Z@XveP+bLjhV>*PO7Z zmh)Wtn;0(^!fZ8%N-HEIp&qr4ZyYq{D ziM!6a(XEYw6ya~p@EpTt$Br(EK5jJI3=)vCU5L?j5L07RmG*T)>Ow3-uZ%vPhRirO zml+$Mz+T}7P@#gUjb`B;-wtV5UU!vMV%v`wo82}NT4hHO1BH?> z%OrhATY_4#*}+3p#gV7nm|8*aaw1@WA?X&doG=m4!dTr(jg^Bz4l)B6I&;^f zB>6#J1^26O&Fgji4{d^6cOKxzXkY>NaCVhf zyVbPZrad)ZawNg|RnZ>kmx~f-!#vd$)F8)a4TR{QvoT}K$d;};whrk#Jp%vAIuIh$ zpQKO{EEQ}GS&C%|`Ase7bM6>wI?UYw2Utvj>d4Oe1){q%o^9|}55JjXp41Af zK)g!$yv4wk#h7Hzbjx7=_2hSjIxoTR=3TTEV7@=X&Z@lw6C2wRZONU>0dB;|5roEU zJc6$a{-tJ?t5N5PW{T2~wG4RRsteqJSbJot2g}-z-5FiVog<2lvIO~b4cVxg^g2<4 zkv+h;3{e0!0Rc0VSfSQ@BZI7^iW-zIR;NYY{-64yxKPC$LnIUDhwbg2^og`E#{}lS zlPmoMn%WH-J$r9DoxobM_C>{t<#!{f5DMrK9B`KgH6xu5Fiu-somqa7&=M z?&5e`ni4lke2Dhh&-u33jy z{K3}+Ow}KYxheeHEm47$sEny+$0mRSuHo%%IInN5T}5wk#jZCte;WqnwVV=qy&{yo z4|8Y9vRrS~mA!&ML4v}vfU2GD}8u!slW?XP=gAuu>Uck%cOB0W&C$Zw* zO{UG$Q(J9tj8J$8&pc}NF>EO6pTyPgG1)cJ^k@kYAJ{NEW|B*1rip>;i4nQ*3w6U@ zZG5i-#j8gr!YRWHu6X=OBs@H>@`=uT@p42ToHZ??1hr+5^msq4l$o1)iju%t>z6}m zNcqUnS~B+O@d_8(OM;FtoO62gQ%`o5ibD4c?qcoA{*0HqZa|TGPmDf zU0*4!yPrHIuvB!W?o9!}u8t0KPg$W|_HP9H1t?*}UUXiX6Ynk?h>c=>== zBEUozc8qZEMM^hUWofu%K$&Z*O+e8UmRUxI#3-Pt3m}{PR>ta{K1X2rpd0)WdyhzE zCzAmIS6w4%qaW`j?H#q0ow<{`t_BPXBTQ(hETSu>fH3RRT?0P;Q8d|TbF4$8E?6YL z%|=NMB5qg4ftA4OoC=2V|A~EKrusuqGxZWDu_jL5d;P1ibQ%{ zO|5k93RI&E$}f74uk|x7ST4#q!hSHbGcpxin%H+&By{b^0RB$p`};T6_*)hy)rdWv zft06{hIbA1c(aN;mq`A#UG{xRtFp@#Z`CiQ=N*syo{vDJ&TK-Rib#wDKqHJv4qLwl!R)rz=H_QacXMWQ zzK)M`EtEoHX`Y5cOVTZJhLY@g6H|M7+3ph5``r)cE6x6Z{sZi{{0*X8xd1}H2UssL zZFZo@X2T#$;>J#{u?|hGU;6mM!h>TbRH$fm+q=y0uO? zAv(UF%|v`bVjTp8`YBUF*KjtCnWPdl?s7j)(LE^WZn9%W_i(O9cW`i(^r=-~3}&Ax zh^fizDM&3ZiT?xpwl#rtU*L`w?xFJfLKXcBlStgv3I44Nm;6v;HP`(ep@$GCp}FG7 zg^wopS4-BlrH^$*Gz@@985lJ~TIPPq7f|ZT6*==2l<2N=Cbs;z;;oROnELaW`f7jG zluYT-!ar4HMx16Ily^`dv<`d>=cikp##pkZ$k&%jPF5f5hxH6AA=Obd@9YcH*8sL_ zK9PSER+#q&P%tcn=;a~LsM%*VVz1_zv!)>|cbYg_K4o?onpMI zg>}B#z3HMMWLH7o{?>@KHH*DD`t$rHN;P2C56@@z1S`x=a9Jv4&fQoS`&U_RjF%&A zv=&YT-Jltvc){UZFe&NhUn9*pcz{E-|=GucmX#?|-=&wZlcF`7F=+ z?R4+b3Q%Fv73Tv94~&)k{u_q3^Qk2O$naYbDW#@{^@S_HBZqFHlkv zk5}7!wR6OLva8!4l+u1l=Sm&4z`UGwsQ+jq10hbXrK^o{AC7d{_1H5tmD^i8`rw`v z4?H`^F*hATHDJylXjO8qnvDTNVBL;qLERMj`p;?)&CKEbv|S^LGN=BAg)%-p19_Is<2|sYv44p-v&GUs3D<{olOTqn zYRS}`4h{o4s&-RsCf4UDd0 zZ@-HS1h}XUoV>NpYnQioMM7J@oM1P>ibb!g%PiVFr2Q8BE0)%xj-EUDBQ$^7`9QLM z-ArNlq-vf zswxXRSAMYmEADhczf=l|u`A+d=qQZZo(~D-@2Z}@kD?I}zD&G@bli`hn6Z7s`_Xux zFaX4-k4Mj4R27G}KjFb3S%S4$-n)mi?i!mZ{R`b2>ajlF#gm7d`_@1|PsEHrn`>en z?>-_j{Bxv84a^v8P+Y=lM28IKQ7OrG0vkC$(XniQ$mPz0-dVQ{$ET=gIyw5*SziJM zRruthqhd0dd5B|Wc)ZHiSDOTYcjO+z`e9#d>;ZxCOodP>F)2}Ss8IaN(M3Iup2b2j zU1@KTyjgIA>(YF^T*K|HVdc*ER2!pSJD)FHQ%;C}evn^S|CwZ%Fnd>&WQaRe>Ky7XAnL z2zq;jlsFfh>-GRh-^n!(pWhh`DF69TR^P#b$~_6{@$SI#e`uv-*z~Hm zw(l00jW8fZ1w=82!cFbm#IsBX_^zRkbv+=_{!v8$HX;+sKVJBM3o-u(X&y8D?O46+ z5n@hR-Nno#q0HHwygio|;drI%xaCFVejVvEO@@Za zSY||jxF+F61avB!Ia-=pTYI~>?13_T^{lCQ=_(LkTX5@8kPI*bBx(1Ct*-+)aEY-0 z2yctoUs_7zpmI310YhGqyhp-@!wS*xX1-F~N#+_~RBI0tCKAGsrBYh z?B!>3W<&*V;E9f^UL)Yt{3v@&cEU7xb(hMmykRgQD?FrxhXb%71%W7PQ&}7J7ZJ2w z{+@XdW$9=WF-#rj*GR()zZ*Bmv8}6uSCAf(+I2KDHYL|u4+50K1I+Cf`H5Eid0GN`8?;R{=in=O3w$;Hwlyw#UX=0;Xq=8dnNcwU^ef$Y^nEAzq zcR*u^#CYy?JvFx=gbJ{}=?+i?A9u`BieWKfYu}ld!17QaLte$|Ha%Thzbq2M#Wpwd z{Fh!vilr%ioImHc+)R2a3n;uWGjn;*9Iq$lg7+RX$f;_kC?&fEmXH`Frfca-b-CVZ zThBmZ6d4J}Np7yKMef!}o~WL|@>8*cTmMpqn_Lh@_Bq$^pLyib!JUU#gGUUOc#UkQRp-=F zU&{aCHZ0jZ zF?ld&ETMN=&F5(0T*S0}%+9Xn{DaEnb!2Fz2;_YMT?_@hS0?Aaab|_V?<9CXxUQU0 z3$uqH8r*-Tr(t)K^~9^Q@0D<*xU96Z6okbvNOd2;`KYSw(2omKa=;V&vvnhSq- z1uH>c74!(GFoP8CP}_>B!n6oUEDOf_@oS~)+`hF?wmP2RUM}(2%Y=rR zgfGcspzn!1V;}sxyY^N|Ugn&QdpP7Wv@;dZ%0wsTvZsop zwI2@9H4i6!Dj8nU9X4>o7cZV=q%!qV*)9gxYZd`QrQ0`9i{s`b8#)bC*C6LLdfqhC zS3w!N+2Jw1tSr-XzgcK?mOM^YjF(u>0yB2@SK(lw!%E?+YQxOIkeY;GU$y+et_uCq zJos?HRIsVtGUE4>@bnG7&4F>5yRNk5y>hz-**I#gr{7fv`RytTYAl7%;}) zPT_GkqnU2^8bDz^b%aG5AJK*{af7>I;fPM=xQE&uD8`J|3vzYD48Mb@Hz>auiJqdO zp>03zA_pq~pH<0{huBcH4O+0_j42`hIwYIX`#ttYXN~b6h#9ntWeQfqy!f&v0&}-} zp+?u=v-6ZIi%|LkS$?V&Q#I^yRO*Fj`!@^Y)}=*PM`>fBcbHxyJOrQ)25W=KY36_i z$4>8iPpsarwy^V(aw4OD6`FQbiD?~H&Fry)@x4K5Yob&AvL~uos4Dl4|B&pc+s_L{ znx^s;d)f|>Xeid1+AVpZ11e~jh&DG(r)eEW4PM-sMCLPLId#ConDYrn*; zY*f9l8@AEW`*pO#N;G+Gy^Z75)Tn8lWNWJri{U;npe{HeOrpzlx(wkCvg_!q3bfve zh?om5t@-?Zy!YbaI@7dKzVzojg2t<{#5sS1Vq_0rIa-|#yb+g9{OeHqZPQqyC}3<| z7=zcXRF*`|Zwllm_G*RVJhIHg7CUc0B*Ob#tU1J$`@<;PyWq~wLG3Rm1%bXikREVz zhKoChh0TrF%>9|P&Xu=H!&zUvgb_1-t=L<9iQdYy#;&^95NvW)mo^Y>uSc)%cze5F zEXM#}kv*2oiZ6PSO(WF1+Rmx}sYc-8X&NRfxB?Gu+kW38vrS(JP9h@TI#3JFC{2>4 z&0d2!U~p{=T|Qa~*Xz-@GxPg0-Q=ElvHpmgHyluO*iD1zh)QKJS6Vzkb7F5WcsNIz z0zWf_vgcm4fq<*d2DSf1nsq6%MOb=EJ5tSM7&%)NuQuKEr_C}Jbkt&Fwv(hLKM!th z=0ci$4PGJq9G-Tv&}N0P1PD${SL$ApviCV8I0^0u^(^rW21%ndQR3;FTWm$$;YWzR z%pr$rN}5V(7ntD#Ae+T-Zbvd3dcisGuzosbWXa{`gG%f3rZ=!N-LC?}221VuT$_?c5VaBA{@@`7&Jy{^~NA(Ww6gCn@&7cme6ljTqL;R7RK`@h|#|(^qiq$4LK)v|N z_X-NUX>3u;dmxZ$^86gPcNY zI8Kv+0BoL~<{Hzo#}q`>D}Kn5bTbxg8R^W!$LCUTmCVKz#;2}E=#Sq? z6pZxDQiVm`xYDb4rh9;)pSt*rC^7V!Qj$4F4|s#jj7@LQgP?_*+0Ww$TYKTpAD1Ss zDOcIE6Ebaee>Jp;WC~saM3(kuMT1;o@*fG3eQ`94bIG#}!3VpzUIzM7(kMLn)2m1YsQ^ z7&;5u>Gt1hUQ${~+5;Z=Y-$p@KFU|o=hl-6?n}bhd~J)sE-zkRLW5Ga$r8<+=tIU5 z5T4)9FMURDx${~#4qyGR7t2HP74hq5@L49U zX3xyb(L$YqeXpcLe}70L<-Pc-2?$jsQ$fYXkK_Fb5sROoN8QzSph^T0|1T-*9*tVH zP5XT}&Lpxb>w0`RbMCEmO?U0@clt3r-GcjeyyVeOD&CwJA$Vx3%$z*4Kd_*Rr|=b6 z&NygyzR)kX+=1FLPziowT#c-ryp}3-F^7qC|+~{^O ziNN<-lw?vHH>tcl9Uf6!56+?l;Ty+$oKm3EgzEh_f0*G!zJ$rXTTrLbdPfwL=Il3B zR*}_2l=%~2{PZ8Og#Pydt}AF)#0q_?c>=pdcAWTa{UQ|=2gH2~XcKu2)VAd@Qm(%5 zc~6}zMBR%MYaY1qD>Gig^^PlL*$jWJ!}wY?2buP^FAENV9IJ|suD&R8a?E_U`u<0f z)V;7ovqaph)iApCN9_yGXw~;ikELZ6rV-62T!oQ~OHZt++-a+D3YCxDrapb_*c4&a zoGcbp9B|*8R(6QUoh%eLI6H1DqeO;^l1!6gBU``nWtHuI{j!hyO6seB8vh%LQSE-i zvh_m{YXqJ!!}HW?ByiDSIy#ZA;-aOJz|!=yw?&E5=An%_q$aS`atI9u9-CqIQTpLT z@qTGMK@5dzJ_6ol%o|x}8}P#DZ)?&Y${^RNogDf4sLC;FFFyL$w*NZ`5)c&}j+k#= z9I+n`bo`(=)|5ip;>#jMB*y9M1-+Bh*vXN?B_##HJA`wcQOkzXX$fmUs(aYD6!zb1 zrYn+?)*z-W;f97W47~|4($2yM(I%uMU9&9JB#`t#&g z7R_kURYR41y2I$}EAFzi;8ZVt{iBPHMQ8Cml^5c@gidno5oP1t``w9Nr0qsKj@h^G zt8xT`L*wlj(!<0PBRQK z98ajja8K|OW+cx3D zEgaNLYOA|$GQg_FSt;s!Z_jBz;wG+F4Lcuy{JWcpydkNhwadBcn@F>T@_WUNl&6H7 zh*^1FTR$FjV+K!keY>VD3@NJI<_ivjt{F5**{l#*DAc^thzpqoE2y`?+1c8=#K$bG z+OoO1dHz5qi_1kD%7}-KXEut_t)gRSufdR72wUCYG~)ND4w(Urlol<4O2ROoJ`TgVm{i5Tg^TTyZ=kHH<_uo zYNa?v^Tt{4S$&)P$9g6z6-HxNTU*-Y#s`N9!dSa3MqpJ9>CuWfu2u;tgB9hezxG0% zGn-CVci9nP<_=#P(goc-p%6CF? z*Tj{G{o@Dq9}az9k7bcJi`O^^P_b1xNhF@J$~@Occb})Fi(2M;5$g)dNKKp}X&0VdkpQfVN5+*9A*_ps1k>Bit6FY3Gy%ClhMki!>{7VKu-*_CGnQHQv0oMm=e zOw#dll_5WFggF$M*1i?}YjpCzDe<>#M&;Xg{U|q`N8xMIH3GIhqpw49HyAtW%qU!JcPc{7TGqttukg9&Adpqzuln7MD058dFnWC{1w1L)S<6o*`GH zT%o@J)hyy>=&q-2BRHv5=!n5JK++ym!& zV;1$fI2LoiT~oRuw3{4&jav_@DvfZdd3xjd*9uW+IB_>NqWhWfmFrKM#JM#bwkEk% zR92Goi6B@(vg7fQ)O<)VDT}WXV);@JUZf4-6n+JWFGKv|U0m-Qr+tpg$w!R44gL6r z%d~-|SAAjz-%(%}=+b_GT`w6Ogw0Oq(b$=ph_HhT>U+^SHs+KhY2WqeImy9>rH8L1)nHX_+8n>f5N2WFi_p;bCNiD5=9cXG%_kM>dwOYX@p8UJo!q6W{&!xGzFQ|5*7%VO& zEP`5Y?Kwj;21}Vg!kWR$EZJM=TD}AT45a3f6GQTh{#<(_(5De#C?lp(g;n+#?C?iJ z@SjY1BndCFLMf7%N^x8$0=6n=rWv)e&z#HlBufmNTVa#A(4`1&gy}0p+y11aM8B8c zHQt6`y{M;2mQ*aqDbZxCtK-(t*HT8$)L`y&EZ(WwD*dY2>ue$8!WF^JO`O&q-4?%O zXGonBNi5r~8*wv~4+k)c&to?UWCP`TE?Lu}P6&=p5yvEHzuLMof zfHaTkvL!F$_288$O(FbDt%ePAvoVV5D0**4c}nX=p03AJ<>UQ}D%`;3txU3&m=d@@gmsjv^9^64|AIu@)_kvj`1{)Qk+F_2f=vC`sagTTAH{B2a=CTLz1`!ZkS2T^>8xB0}* zNb7d7#+W=Y&WTij#h!3XvnnpkQU@p*blYm0N?KTz;O@-?XY zZZgNt9C(nj)gf7)hbV|p+R|&iBi$f&!yd^*aRZnS#T7RjSc+DhRdmx|#;~#Nv5$S8 zsZw@sA)pvKzzz8RWRItFvrtM{)48*;7zo#!M5EUIajLO;>fHTL^d(sc|Lwlx(l?j? zbDHSmLu!fO!qH5`z(=2BpY+`8+U7y4o~5F?Tw#IJ-?#ZXkKENn0oyHBB`v4Ca;0?P z`_c0=<~MXHj#u4FrZOp-gMh&vA(VUF<>Kk-IL-re?_UN@pbGKIS=sMSu}h+SZdKAb zP28a<`ts#pO62OYiK)RqPS(4X z#JG4ew)B6WqbAPlyatQ`<3X z7?3qCmqRW_rfFiG(|k#VCQe;o{`)kLPq;mZ;fM?;BS*DF((-`69PGqU#-knWx zKw!$^p5*}m@{2V=={VPbXgfUHtB!s5vhz(S9<(J5E9pCXp-ASgVphK1kuSb6FbwRLRnAeKz{ZdDtM?a zG!P!^+b$DfX)J_ZG_vWxxYz(iZW|l3nOIUFa27j}0HT4Q&m_O$Hw642qQC#)W&c(5 z_dgf^uSI|VBLVzxqQCzz!2chjzyDDJ{x|CPKPd2jlP>+-E(F$=JuhA~(BGGq#12qN$jE%kY9C1tz{)7nwB?Ex;ITjgJ-dxo zarW6HzyT=Mc1WuIduFrqPlZS;EQ!6Pi?j0=RMxFF{vOwrmnZaQ&`pu@`UcV{^_(+z zw95|WYPu2x<3-4>Z>)t+ebIWF|A%hFS zdZPU3Zf(37c%x&jvepE({$toF%ros=TN3}K>pd~ZT`f1YXdZ0ie0(myY{Gdnt zA{apu&Q$wndq$tNr_ccivQHGzRuUncl-RFl!V^?S~jQ6@fw+iFR%D3 z-)Q%`4AiTsuOZ)G{VR6dEQj?Jn&dph*>s56sZB(Qh1qYp695CeUAx$@v$H4m+Tb-5 z-b@Y+))?7~zOy(xDSX~}K5YQ0A$%O7RzYaH2;LHJhVhcmdF62@EzL5+Tl~AZtH0&Z zMM5*?d)&^Qo-xw(3kWNWvHe@6FKCv4_jd{9fleKeD()YD#}z&h94f?dGWz`?=~#aU z1KJ9OD&gWt=DY}=OOMryeKWWupb`8ibyY=pW~LiqUTAfZ^(9jRTQ zQ9KLyAvr}$!!7Tdu$#O4Jri6Z-70Qgb-v?6HBck)qqYt_aUxtil zGZws~%F_frD_0KxNB2({J)bnWHKOCwb3Q$)vx*$;OZXPhBJ;sX=xhv+-<*CvY`&it zNceXHfzBtRCFy`;YzF#U6L3qATgw8to>&{aN)!0iY5FWzCsZjeq*3OSO+G2|dOXW? zvt8{ohPgO?`Hf-vyZm0j?*Zu?fPCU;wz~mTh}G!!xWMXMxK83El@zvz@F?~0Mfe$O z7ebr*E8+RHX4o?D3eEk}mxYau3nQcQp2_4+1thNBNXm8&s=d?T6BBGzdSc8(DUjwHdZ2wzyKjK3%)e@2dUm$1+&b93%RC>i%4m@W1q4{(S7m>VCUt z&gi;S@Vl8k5$GZRvx|wO4~m=4?(c;S4cdS??`K3H4X8Gx%ogj_4hL56W%b)Dy4}Uo zJC?y4T6To&(}_m6k+b@=|5L|jt9i8M-qN{Ku>s`k?Q`s>!`TX*hKV(Gj;|L3s6M9TUV8Zer0mCi?{k)dPyGf8O0me4T#v0UjFznS`G?(4i&Ep z`)$&;2ciEe4Ww+YyC0rAd4EN^rr)dr+a@J&EVdE?KMd=I?a%hUG)r@d-S5PlBCpk_OM`5 zt}ar98A6LQlB9tJMzaa}As``@OD+D%2?~7WFD-$zdb$9R^o9AzxdTzE&nUqP7q+@DB9)-F z%f%X`r_QTk{0+r`khXPnu}eKXSFQ`LVZy(c2hdgGqle^&zpQ`-`+ZpVh#m#`6Vpi1yy)=?hFsX6cxO1Ey#5P-N<=mxK5G%b&xdc7bMQ#ogYotDu4;TFo(Z8gVZcR?4`0 zz^lRBcUTYVHRKHqzbl2cHFoS>of=h-UMyd5L2$3H{%e4{1vT!ydL z(eu}+s%MtFk?UXnvmU|e#f6qXBL3-7r`S+YHG&9!W=y!47I5%Na?Z|+>+XRm2Yvvp zyL~Jy6u(P_7M_r#wYqnHWl%>)>Ws*Pf)}8d$2F*1^x?GEy~S-yAmm*$VHGV*DgHSa zLK=29<;#8JO#eQFt;99sQ_4|o$c>J?(V{&LYMpB6Ds%lMAzhU|n1-MPk8B&tB8HZF zUmXhxYQH-N?FLZj=p;M)rzo6Mse%>Er*C&``j-gZK|?l9w1jefTidzUc<@5X`r1k} z%rG`!#B$v8HM;f)(Z+eyN`SM5Nul48AcJyxXGWtpS~8Ci{HlE^t|)Yy3B7J#+0%E3 z;!o02+dA$9v&OLkZjdVnyby+ zv-V0P#j$KeXR49ETVK;ALi3@gLv3HquL3*`Tk`8GkqiWJ&X6&%aXCCkyR`7_4rQMp zZ6_4HHE5K@rfd4OdM<)%9l^;}<0|XaT?-9IGoGHZNJpai;8^BwOD`BDEqO(t$OG054wAfxUd252^nN!*{CX839FTK5-UM;{% zjKsl>MWXh4Tf|y1!k4sp4})cm3&S0&pXgw{EW`v9ZCW>fJ1q2fT{qcP`eV@8p5J=1 zI@Sl|3tSD)aR*oGFd|JydQhr7-^}ctI&g#cfjpE*F4g99tv7ySFtcu4%x8RRAm_Jp zaJHLXEy&VdLK2r6rZDBw=`#s=I3KMHmW~<=$?w-SZ-lgm?+%~}wZ2l9oD6`_=W3n3 zdu;Q>?y4{OA*e+KV|7M=EhiDJZ$c1@Q7UUG`JCq0pTE>>0k>BvG@3vsz_&)=zLwH> zHfoU*Zv@@7Zs-8Kf@93IhpCI(C)??}jp$)wynVu9H@U0aviMcK-*3Lp>dg9o!zAeG zMyW`d9B=(13f$vuag(U8X;Ma~IKFxA>D0e3pzpa?dNzbFCpG%}dqu9t+hNYV+$c@@ zB<>5=vvFId28+NDTqMf$*c4xqxMb9`n1E)ydJh@=Q6g9@5W}1~sGj=gz52kG_579-#6tvyqk30Ue(-bErJkZe3F|D&Z`qGz8z zeE0}*F>Sac-p?4k?x3!}^5lG8UfUZWM>mXIVuKM+_l1m3m!fQmktS5S8)^7u+&zrGrfNB4cKz0;lo$)0;dimBcV?KuDaF zLi#X%tmR9_6q{0SC@sj7K61}y@U2kDVDdVF0sF}RN>EUr)Fc2qcy7F#Eao95`C)z! z^{)0NBBA|u5$VU@e8@4Ik0-QO5>z@kMvbWq`ynx|BFxMBzO&nXZuvg!^+HS8I~i$= zolxuZw=a8k-tB?Hl-3pqL|h6uBFapRnJxb2bz$@VW) z!gdPtc`_k~fEx;Wsi5|$h0WzGAZd`qIJ^KPM5cc{c!G#~_1nr3cSF7DPML8#J9T2m zp+4F37)9jz5)OP+UBb@TxA%XEq&~?$(=K0{+BLFx)d_L<3=zRBwH6fSV)N5hLUzd) z&P5V4qu1Dkno-=F`|`Ma`4X5fU7*P*^^wz2v~pr{pdbADy0(qyCp_XhuX|l{g@%3w_tnGFO`+& z!bDAG@*8loXw|Htq0J7R#VXutLq$ef?5SuPY%%IR1Ya>?<1lf(Zel0W+F3nj!tMruD3yW62B{V z|HuBWs-24?a_mRDt^ec9N$W`sdZy!gpgFdhnwEpoD4ozBWO>7O!5bF=#&c|$cho8( zUe&R)OScP4CG;h6I-CJje*28Y#)kJhS}`XpV;^?QMqU&T?0kU~Ai5SL;Kv-f=1paJVXu@vdeDbZ(N%CnbP9}c7JO!d_zQF zpb@kealR%?(4||hx6Je*(o1T+!gTM&yTILDLgE@KAO+>E=ZPvYjO64{yCN8ZaY#~$ z@mculVBbFd5HRfXt5iyH=Z~+{)vUkTmy~o#h$+yZIR7(SOz|k0RDjU*tG!xYcCQ{j znGKbWeSl1%*ojN)0vJbJy89F?P(!ZN>%TjE|3jSXe}m+TEw?i!;130CG|=sV68R zd0j^_D5j{5x4FP~K^0zpycz&MVIU@dCjhX+b}H9Ci8RC2D)CU)A) zy0bi^42^4MUJAjN_@gLUH}R5^{!IFV5%`I;nv#^=9^82rci74)JPEi zYzxVCtWt8pYAIyKR)5L;8w7k|JWBH(chpESC`(|d>$@{K)&Po1{;l7i_SQ9BC%iKw zBM?H3*oR)E5C%=W$YZBXmd;nY`5d_z=Ie!4o?^HoA*i91(M#SP5{*l6++`1Aq?>Hq$-KJnkc9Sy>N9Y-F-i3}_ENb5@FXoCqf zDF2O?7;=hz_3xRDd5Zp0{*5V~_5vy8|0pgeT?Vj7Vxm{67_jOW-u+|`c1)q!RU>!z zssm!yWvFiJC2Cd*(;@mLfYX>g=2usppuOgR1%G!wlja0~F8jrutRZIM{&KkjO^|Ga zsWR<%ea`5$GM55^QCY9s_1f~-;?g{;17Koe^M@(0SE70rDHYzu{}$c<{9x(T3veA+ z#MO6m2)!_Ax#y2E)jSaKzPlpt_5}q16IsTf+Pq3$&#qaHkrq)&&p>91Dhv036<|zj zZz*18hv{!aRZWJ-@)u0%~dxs|K}q>0$sco9L)gd7&kKOZTD>T62>W76Pa$_&Se07cDe#x2o>HI zNk3CGnUq_fpN=KU;PCmckI|8luT`H*70)x=h54dB(dw%~;FF~f>I&&lJp^?tA4?|P zfITx$$Fr;8(ixqX`xJaV)kqX$)wBpF*?&rR{|2c$b3YnMON_UweO2j7tX_14ZiRxM z9XsZG-;vvozf_$fU>?O3F7Jr<*+EZ16~~ISPbbILN5D5|UJai}Kay5W0V zqys4Ro-!^BAp8fF)HkI+*PeF(g>0FA>mwyMnJS((3@d8`U&Ok%SRu8w)zxu8DvJqY zGUSeEOaeprdMBmjlElOGrC)U1=hf~OQ(N*gSdGUg3#vqoVXx_=?RAe_gEPV2AbYh-)d)B$utP{W}XtF@=IcP|DCVc z^e9Iu?eHAZv$yYMo5DL!!4rPY-6txP|zoN#OiR}%bYbDtXR2BiWwslU&ZJ$rJB z7#8iuEf462Q$ICLcb7WM0bA-hRzaNCi=HVjm@X@jSGxX0-ZVh-rl#EUH;_Yf$IJG0 z+*0Hx$?mY7%)!v}0Nz;jPgUQYFsXxx2^ff$BxoD>Am}g*Ha^^7$QUo3mCIC5Z|NF*HVAxy$@XwU!oPRNaRd zVh#?v9I=JuX))K0Uzx{*>WCU{F=QhY2JvP&DiW5SXih6FJ@J6ndjT&ZH#HW0CT-w4 zl*ela5DoXmN9joxLE^~IMILeSaF>bX%m`EdcHAo6cq><3pYv#6Os*1ehxC3?V(;F3 z=IeuG7_i2rdZUI+zrD=kMV~L!XXoy&^tAX;oLs%g-Okq;CT~XWD^?fF#Gdd>HMp<5 z9i>5l0_@CBC7CogOT*;NIvW_vTlmwxX&4uFvrhOwrWY_WJpbtN?9R2A-COIKnNKGM zF()WRUd3Lr&w5@^udmWriUxlv_EJjF$k=T8p)D>zHOAY{t_e>Mn5$dcBs4GZNG zLhmCeI4t3|c=m-L+&w}oAvNt#e(fzC(DaMSBl3LJ8K)(;lcgA2HsJA^kofq#@cUW} z4b=MN+BftLiIL`PsI4+duM?xM$<6V2ru&HrvXW(UoS|b5`ukFRUxX`A+R_2sF3SPw#pCzBT&R zc%=2TLxJ%(i?7nto$xec>V{Xj!n>>%gpq$2$N^&4WUevBKwl@L7~Vuk;Lu0!sAyHE*``Z&QD1 z^{hp#qDjoZqGzoSZlDA#Rb$+6R%}yN4T%jI%vgOzVbY&IonSASUh`nWw~%68a{Ut_ z{Fl?X;m{B7Rkns38d@R2Rr4SfNq?v?_o=;?Rfb2t((BR|n%&92J|AWrJZD}-V(?jl zJR)b6QakBv3m0K`1ilc}I6cbuxww^IJ4MaIPcBs_6EjLaHkv!fTYrOHmzK~sv|QN9 zglu>EGVznoX=|PFANddxwUJzksh~{AuZWVb`&Qx=>HA@4jtk@3q}|7}oISsOiH%w( zr=^V`T~(t!rHA#CkG9n>8;`q*^_R$yjPV;;bQ(`Yu3SADzA2 zI6h@z_9l9sq*kpv*@RfAk|bVpe#yMdAIrr_Aw^4d1>o?}7Ie}UrnXyx<{QVP_xwz@ zj$R7s49VS(j+Pdsa`Xz6F_;QWR8-hb+j^EAW)BLNo%5!HOxX6&c7CwQ-n7s+UXwO= zmP@|hvaYqLsgK7Uaeks+yBa!r0%?vv7^tHrSmq619F1bh21Rh7c7Ds1?Qr9L^-d90 z@0Uaex>sjS4f65F5ym$gK*-g5SiP`y{gNZmSEs^vEMbe}%y0z`YKCpV7;voR;@l6p zJ|le`Z76Yq=5S`IIX0F?D z-|r2OIf%p;d-_&mctGBJD<$L?NjMsP;7*Yf9G4r&IGtBBsjK&PW{oYro8L$Vh%Xkw z#Eq&7$D651_!L>H92bl4hk7rr6!l4dG5377R^$XYg@6NRgti92d5SjVi1bi}Pq>D&Hqg2u-JT<1%eg>*XYIHgP z_(49b+x}>td4Ijf;%pw2PAVV)TUxi6{IWq~tf0a1Wb_o}G8y%hPEKlnVCX0PYTya= zmnRlPC(oyW>SXBJ9RV*xo4vjo51#(1i&tA4dFs)tY&5#Yxut8|puCSJ5}8p^)pCWJ zrkh!~w5oW&Ms%<6`Qu)7GoY%X_(EI0$}CQ|qG2t1(ca3_3tA+rTMb%^kfp#V|z+WwmS2lFnoZ3wNpKGGfu0V<&IAA$n(ca~0Lf?v#J=$IzY8{sSq4QnB zL;m#qLKUZnjY@uDy|V>l!c@5y(`pj0{~0jh^foV`KXzm=Y3zo{Hc~E@*(?k5hKUgc z)%e?@&}&H&#k#$0&WxD2wRgq1Z!WljwU4Blp}SkxiDkwz`+~9pAdm+{kk4PNF`7yw zPZKnEj+>@;Th&SR^aebU4@$^Xe$;k3utsZZ1fgRB<-J!_)iU*hmTjSt)&ONRx7x=Y zLjT|6^oFp=ipqmsiJPhxr0YV53aw*IuYo8m5O$dLdACGHJGRsR7py{j4P+M4A&z2c_zKBmpi+n1xP1KUb=>f;??}C_A{tlmJ*rhUIqFCOKR8DU}mP zdncpcmt_vV@pJnk&`f;*`X#ANQqu9uwT9xK$*YK;;e?(!&RtcS7~NG51j_=AO(#MQ zuZ)=<6Yeu+bH%G4IIs@K@R_QpHfsFRc(!S7ZimH_=~6#Gf^gJjZ(`u&Yn<_E^T|a^ z72EE=XE6cF%1!co8~G0!XS+m;`hFzSxpc#$paVdjZ$kRtTl$&i=0x?DePQtD&ug%> zG0*#32p@nl{ij?3a(`i+S(%!%H_NgCqR!}IYEiwB5s?P@ zU&-@Lk5FmE5poLSp93}p7$;0=AYmEuzkwhB1%>>dxKOYW0kq`*3(N!dg1`{|b0q)$ z-~UT4)c*m(`M>X?Cv+9y7ra1T!_wMXfI!Io^iLhwHLUM%0C%k8z5sv*|3cA^e$}GL z24?5_afgpBK61nPgtglbq3PF zl!SkDrSPwk!#o}#H_Z=0&tze8^Hgv!{XC*%$-+>{LijjXlC|m0s|>d z0|07(79CFoKR)N(cq{$w`_eNfDlERaCI9*2{R$%{{*lmX0b=fE_a7E7nnIu1mj>pZ)YkyKxUm1> z;7^}?OGKLHi0X=jvjy8ph2hfeWj<~=dD9v73q`4zlc^E)8QZu>K+yGb?ZT~n;se4r z5?z4=v$QG`cZpUj%r_+cBgtBCP|q;K1E2){^00we9J;zAX)D+*2>q<&<6muSYvbyA zZS!gNQ~NYAoN%ZAGEx*dV91O;f=TzD2@*6Od=D!8Kh41u^OO#y3#RNq2!waFsC@nX zL`$=u0{SkIeJjx435Q5J@a6_c*k8$|che6uJhb3rtMM0$Qj-FGC!fiP=TT|7!pg5J zmt^1FfCtMc#x!G^iT)9vudpZROBVuqiL)c7`x=u9OoISONp_D z$5*KLm=p=pY$WbUYX^`o`4}3W0f|n#bf6(DE0`4=@i`4y?+^=w>Ege@BkB&}Z$50s z{>+^8GREm{Ik=K)U}$)B@Epx@xygY%;I##BiWO^k6jSrEmEIrrH-Ymp8AJ?7Ns3MZ zLj&@7;qPJt4Xn)E-7(n3@kAjnG~OxuAoa%}H`??7g+H{oAwbo;c^?-?hB@VxRQfvc zPOXr_^PTe8wyTP(WPqybhei(oQ9%3h8qn9Xntm)-0e8l(?cQu{GY&RF9f^M2`HntT zE4wOw`Dy@FcP#f^pI=;bw0SNt7b$#=)l&9*rmsP*ee^r7qRQjh>n%`)RPXyaZ`Ap8 z+B`A*^Cg%lj3Fk9-h(NrQSGJq5vCu^w4HlFxPonvlk56>w{x3+f>svZ>aBr;(Oum2 zmqaK3VkGh$zcT`a4RR~_NUfX2H<^Ae3DB7!1JdOOL!d~`B@1`n2+>Ll*gIJzSY2%ZUX_|y|@ayO35U&yQoxP zT$*#{}3v8Ku`5`+>srM`aB=F}B@`OGB#3D(VLrlT~3&xWf?%4Xc;sX$dFO*5U-Frtr} zn;!vfGd)|Ds@GI`j3d-C@D&M5MG!$O=i1{%{9r5&haGmr5n&qw5HjEvV-=r8Xy~D| zC5xYl89tp>SdenrFohuSfBk;QeVGl!=uIy_=6pPxG`|v0C!8Xt`PFdt+ulytwG9=b zkc(oQN{xMjkeQwti%boOf#n_C&nYZb)(p)0lZ$%-nz1Qn3rPY2yhiAl~rFNq( z$G0Tfj>!7;SncP?01`sNl3RsyOgZ*Cs{SP!z6yIRr zc<9dy4fm_F<)?zbvhTJH2@c={7U#Uz$*Tp1^#gI6rGo5F9V2H?rZYlZr|Mz{owS`l zNbUcu0h--FL}C;D(&jZ4yOeSaV!F>4PJ9v)&S9c4Xv*}P zhvF)oleA=JjaeQNXFWH=1icdi%UcenVf~&+Z`Ui z-4icAxEiwC;B{W^Z?wqbvf56Neff!+5h;wqwOFgoPOP7UMd?_so7MiHqmZSMr5n%t zeX2aLPR}R*4N;4VHP_KQ;$8=Nqzg6mhZDK!V||BL|6*?_i8)tfL}MN{KHv}F^Y(c1 zVKF}^jpUxdp8PK$#I~kkPKIR!U{OM!0@Np6&^r$fvV45WW}zdW2T{qL>l-4BOT(YY zQDfI6A#N;j%o@ORwyhdqcsh;ZQPBdT&PSCD>~~Eo~KugKL0r(>Nqh)gj## zNZ^K8YDq}mpByG}qyDwn)cX~T2O(bN%FvCCaH_8`6X-*p;ljmw-`%(3}>7? zSb!_DWPwM{90;s~u()K?>g{s<9GkHuMz6~j!rs*K-xu~^ZG?<2t&YhG8`f+MAZazS zySyJ4Iv10yQkJUC<;eMT?#$c&Ipvj--x3cm?V%kjFM#uH>aj=& z+lrABY|{mH2{+|EqP3>H{60%(r$Jv~gU8XFx9e`Ws+g(eujcvPvs;pnl zxt;Qvg>j^-07t*Ohy7Nq-`!x8~m!Rj%na&GeOqf|ROyHQ`w z1Uii`@m`Gpu<%gy_0tf)`Abk3d$kETz9d{?O>fD!-`RgXBbt^`o5?hf)1ms4k)`7< zN&`#l+{jQBx;ux+@r{T~-R`1GN=ccSHIq|4Nluy?VmwHTkzans&+Wwqn7axcr$AG*hUU{>aS9%uY%5Bm;nsZGAUQjCr7s?2)?|7nlAhnb8}jc-mD z<}>7L47AIzdO8`G^m~+5^rm?OO>7yuB^^USl5BB&av}DY-BJaEG*e@{7t`2dUa-%N zy#%y>pkCtc?2TP_`vq|{IUZD#wAkzzv7bNIxQl$Vg}Re;3$+CI;OPoS#P;(`FMp~# z{uSo@H8b8PUdh;yMh3%HaHN`JPrT@rTT5+-z8h;WF0R>&V4Cr_nFF|c0s7_Xu3=o? z9oGwndgKt;6@UG4jv?xk4Pe>Rx{36^-oCsWRjR*}n!0@_Koxd(HF_%O<(IvAc^P`3 zl$O?d0P(=2t=-+*Cw|pnxJ9mm1&ftjXh#&$=8eP9Xw}1IWv;uY3&45^q<#_%6 zJSzK-^2*r^u71V{2RHjzF+^4%xYgOPkdUko&Z6Rb)47}Eb?>gcp<8PCX0}-k-(>Hf zAAVhW-+TAMo-TW&Xd&|IPg*JPFv|oa7jmsQ&DamKTacrPQ%U@F9F<|M@KW z(dlh;>_^G#ep782aNvk8qao_fh?8X16ALy#zIG)Yw8T=Q z|ML`H0)N@4-)!2YDN%9wP2SxG<)*q;rL;V<;jyl3`RM3Wgcw{@q+R<@OZsGt^9-}m zt)KFng~h*u<75?zJ&ma9q3!cWZVwvPcv!M`82d!?9VVwKOG#o!Ch3)L(#XN zag6g|AD3O? zz)<1-<2QI6aB#V(;ExL8|J*Kt|39~5nu1?n!HIDH)&B3q|K9%Z0{^4^zjyfm_CiH_ zx8xF@0nShdm{u~VU6N_@i)Qfc8>pRJU6P-2+%P(|Kz#T2;GA3g< zH_>+OC)dpqMj?VDn|pV5bRPO6rPpPdxCLJkfBho-nRYb~YPcZ5cH-p~nywQO5t2*hlV}S6(bayXJK)Ej|Ho`_Cyi!V*YNm{@`b70Y-w z(;f-J+Xy4kY2v5t@@c#-;12eQC#>r1Fx=wafYBAHP*ZkGu)H}pmywH0pSwBs@KMKd zW8e}igkL^a+*oFeLO9EFW@$KJHdBqC&U+hpl2a~6Nxv^!pw+dH2YuUWk`{d36dSu@ zAYf{KfmwG!)M`*>g|z9=R%F@QPtwX6SW zM@NPU-f5zZo2~s}jyt+mfs;jBb;HsEslSEAo5gwJ(waK5YA);B6@gPQ_K9`Z`!JIn zFj^laFsczY9#!m8SJ7n7>$~yA>#Nb?g?C))oa{X#2^@XD`$JuMpJ zzeBsfk6ph?nXxSV-o!P>L4DKKa){GlSejHgvHrBC*Hw`5lIxGL+$x*dzPCQZK6?%_ zm`3?i;KTb`WW~S!C441_E~r=e14I}pQFq+77ELWh_@DFjpB^K>z4Ot|3nwavC6*L z?e$RNX;{hnu&F%IgVt7Cqf6gDHNJ-a4rw*C>>w{-B5z;MY)T;RU9!)?uD}j8`QWBs zcXoxQwH3K!uS0i=nxS874dat76K$)k6A>;xM|iw9PO0kOM+9lJ*4Blb@OxesCt&nT zaq(0BSTS)bulT0q7_QPtxq2CT{6)o-#bJ>|y2c`G-jM0mYwnwPZu#h+Ci=Ao1V-j=($OI-Y1Wqv`< zT(b`@{X3Iv*VB*&Xg$x2WKI*LfJ?6Sy9S!Z)hDnON$R-s~iW*Zv#bvpME& z+DUKIyLBjmnI!>rw*$mf`uK9?bl~`!sEdF(N>t<*Bb*09M z%r!&PuYy#vR3em6_H*x>eEm259A!a-_CII~uFlTN`_~`|!KFN**YJcWuYJi)P4Jjm znDGYsWT%+c@SvMS#&(!|G}#Y30OB2L=AKYRJ~_)Cw!ccsyg8C>jVY((>n-hKE5*#1 zO)M-b`aBf77wRhNqg1Ph%B)n2Q%&8nC51PW=A(Me%kXAWJ-ROZkJ`)6mm8@Rxg2{W9yV0s~a&tQ$d6++-tw~@_Uvs z0ruT+&v+J#T>epvdVV%~%}mC1l~_Z){Xx$RSJVCtF4jr7PdFpT*NEt7nHkDUwetaH zC2vhgtZu8uBkOSwlVV3Ny7aeI-w5<7!WbuUlJY?pET^Rgr-;3ywwBY<{MaXqUG)#N z*MUBN?3%iCzx}?`BiG>Fky=maU11j~!Osg+)gR%4`Zb&OJBi&$;?Fqu{svp>uIxxz z3Uw6juje}xHXE-)>#_DG;A54{rw(cbM|ZD_pxw13B$ul@=yx$svosf zQVcMu4*F3YqG8G4zc?onvpest(SOhz`W-UC5Xk>W?D})V+z4VWDhqPiK&3i*0dEOU z2C1tBU4M|R7Kv9U(?gGo}>3y#i&tYltB5=+7b0Mv3QZ2lHAgqR?3X_f?qA(SQN|Czk>+Z zlqzRHxNr>EQ(umIN6NImk3jF^DhxO0>vwjpVVQpK-1S%CbeF7K4e}D2nkXXo?SQap z{T*NQ$@bZWX<$^DPcfo|v(f-2S+*iYZ0eo3V(mJKr;dj%vWsC;5#<4o_q~wlCqVJ8|Q7>r;Jnmqa5kA>lksY8}2hm4BUI(xaDhw2U;h&5)@4_<)!q!RyF0J zk_loM)rGq;=}sQ{ZS%^iCCJGS`8NT)B&6qU{XA1n&4t;oHb`jc`Yb~K3S zh3oIn7vu8pBnvYxlSrM?=0hH`E>;&cH(&Ghhz(=;G!@zG>`6s0+!nB3|fg$+9wmV8iXl}i@ z-ZvX08%uJArbyuDqArh1vTTHTeb})!Z~e)UH~Gicz$Y=cJUv#B)$hB_AJ5_6=0=dzulY9D^>k}> zGhmMdibeGXXLkMG%N@N`NM9}v3UzBq+gYF997%j1f3~(iOVNJw&pc(e3W=7&e=(e2 zW+sz6Kc<`vxp+wqu5fNnPtaARkkfzFn}oij!&4d&sL&9^J|4{}74zKr9;NYKlY}4v z!^kYk=b@y5Szb75o!q|4^L&1_#q^q+YbT<8YNbj~*d$mh7u73s9=||Bj8d*0;wLnY=}5qF6a1HF;5CGJHFl$u{! zj|Cig#t&);1`4aUZDu$gb$53YL3nuvg(sX;KeJ2aFOd|IEI#=oyPx<%1-PXypU+=e z+^ad>22b`>kWLlEq(itiUN`A2YBE7AE~RuNin)<|`h2IXc9Ba{Mpx|3yhRK@u6CbehPW;lUD0o=(4&eJ z`b0O^tMG26X2m)|PQxG!zh+0zr6DWea6(>c4?a+Iee7Rh-v5I@FF~9aG4n9_D@!I) z=5*Fh(k0uSmyUXmbGU2oDhAWKvMH8hYmQT|403Fe^CMnl5;)`;TLzZ(v7|yNQ?zSw zgxVfF$uUJAizFs}I$aN|$F)O$YlK>x)gNgNloPwwDJmFe(4Q8$b=e zp(ru@urJ>|Z^!gCOYN;>lTUFeH?dN!#@~L7FFuC@Os~%pe-LC5k%|*>WZRiXvlguwt4z%lfA|)GC_llk~*G6Br0}a{TD8Ku;Zcf zlbrR}H1oLQyx+!2e%mDJQ<1{Y7HK&aPj)XLn_EI6|Ss(G(TK2&qAd5 zTXe(ah9Q71kflO-+h@EbfrVpS?PRH+$2(Cli$*U?3a}PZD7(s2M%zrze6Cq0_?4SK z#Ajz_4;OR4;#!eXs_5JkX7xkLydZNU);PUJ6Ebg4vsE2z%qz5WqVF2?gr}0Z9oid9 zVLl2)4`!y-7XB7%%q92CR5lk?1<|97awD5--=M9g!&7ikJCP@|wDygFcYTJhVtjRX zhL(cXfV5@)W~mIHyA*SxTQZ67#~~CO^t43r0}mW6ueG8yWPVj4Gldq~XN%V?ziQeK zXNPCm9vG%t>78<^6SiJ}ZPJ+DkCN--kZ5Du{Yku%2!~X9ItOJ#hRKWoUVZ;BRxW>d z;@igBbi9p*@2{~{5Vt<9UvZs2cpIRRE_(l%uTml@jY`Ivkf(zFw9#P83(1?_Y;YxP zn|xol?94&sX)fqI{9d0StIMz;^9!mUJ znSH^%D0uO4Fl8S~gk^A&Ca94f^6o-vc=%;?PEJ=w6BpPUGMmoFrW(uRg7pB;S)*Py@yE!v7pi~f*{!|!xxD)#CxU`-+Oi5t$zt1C z7X2Sd{ZHJZ)bL6-$Od>PPpqvgGBDX8H+p7$@G6K$gP1&n?7DV+7$m~zo_0z8Hw$BZ zz?Z}eS6q`LMj_$CY;FqjV6iMz+n8GP^X3@sjsJ1@YEO*uLqqH6ZN2sTyb;#2CMYF6 zGVA)l)a_@cs)zpehjcyTMZUt@+3h_i@hAoHsnqlP65|Yu>s;THZSzuy6oi2E@#t3M z<_an9!|cAHQ83BOhn^wn5w#CexEYev^@ntNhmb* z`tkz(MKJR@Dnqo_i5d&xlDl=*p>?^r3EE~Xr`oJ%qT*6LsNLdtDVIvClnS}W;#Y$Y1-yFczpWB<{6v?)?m+vXk-$I;ueR)F;%<`ztfF5Uyc^Hd0kl3>;T1>a_H3 zg~dZcGN0kJr^?Ph$oU*6X9+oUQ}B9KNJ^EMwmov&roUf~X;A*9CL;CDD%#l4u;v+< zv7qYMVO#fIDqnpt=;yFwCYrN&Y$lGon{rYbP<(e@Kf6so)lJivLt9>1*~_u<@F3RH zgVIFrbH%eH^wErKpBM!4B@Y>6# zNrW(Ne$``z65(>C_1=*OK) zO&94`cHXYO*Ust=UsJbBqUO=p(M{`0w|0V#Hc%!ozS#TF@qZX9#extv&By2H;rKO7 zzRNVAlu_7a$rg9*jgUl|V>sVn(W@jPsft_DwXed8Xi7-zGiZh%^=2r@KO>H^PE78e zdwaca{inw1d2bYL)q|z{aEF4IRLk{G>!(T; zTr{o|(FUmmTcm*|KL&#eyMAHyai4fjLrdN9j0YpiVtPxB=$1T=|u?gjg9wC38f z@V(Fgo=C>jR4S93Hwr(AJ;OE?bVl-Ih=ei)E(dQLO4!R5etDRJ7V9hZw#{mi2co|< zbxJ6K4+9f7vyE>E#+y_2c}wwotWe{8YSQ#~OK@aH-=$Dsz>{~C3gd@L^ZZLL4{8y%+y_+{$Azks#R z8Z$4h3s*%L@RkVkVEFop0c11-#d?&b+qG%1Bw&+$fE@|k!*WJM1gcb|WWilB;l{`_ zyj?jTrm7vH_}=`IxL@x&UwOif=ng#laT}E+7~U;4m|8g5hXG|s6tm_7_%hs2Z8aI{ z&3c9;9X+p`sRaul>IRt^bA4{tra=zazK*+W)J=e~9k?g51K6|9^ZT z2NKx=eRKr4vnYGV=MH=c{UHFC{peh#=^d{)JWy!wED!6;CBW#o%gfK$d^6FnK;3IH z8Tu0jIX509C2OIi5A&e|I9d!u^nZ1@ znKp#vJ{c4c>??T+M(L%V{}{F=K)p2Ia+`G>mY-@K%p64yoSo6V~^^*FTC6Pu8PZStvuLr6vguZU;nbpAq zyKumtu(D5c9!QLh{fLh8@A&W2^BD<5q-!ZK%zlgDyp9m9Wa4S}Q*iRHcQ1t(<^hJ- zMCEFA;+5+u3M{NBj4Q=Ke$r|mfZ@X#gDQDFTt2bbiwXk!y{jz$zg4jI~oAQ z1{2eG4J6(Viwth^_#`hZ#u~O=3lcU_SVCWu%dD#S4&P7RB>6^3BE|Rqm{|Ya#N>wz zw?(G;=gXkG;~v@Zl?9a(b?j?}C_`&&r(~X{J-U?&eY}ah5Q*eI-NG^WXX5hK?GehGkc3s|=j%!IGcIBGWfTeN3%KzP_7B)52djM1(nhYjaKk7&Gh71wJ`%Cs2! zo6J(QJ*B^*saj{F9yuW?K7JO2 ztKhL2q!n!DO{-eN^{i^P=QPvU@^D}#m1X=a3L?26-{iC9YwmbkFhlMRBGrvQ`+rsb zI?WWkXDZi<%uls&o|>5xSQbP86T7W{&Pwg?Suc?$rsKB#+!ASM_tJ$xrMf|~YzvFX zq*X{d|5=Lj@IMRX(_F^9ZdH;Sfv{m1FkMux{gFy5dtcsr)~Z*ZVX-)uH1`x{REc1( zh&rtOV*?^1BZ!6T1lr5(_A#e^g+uqh)m$i1GtT%hlie7loW!C0@o|U?ob(BIpf6gd z0(zyUIXGfDk@KA!8`jls`OlTPk6lFXO@=J+hDz~wJkY`>`;lOeiIriW6OBpsx9<*L zTrb;cRo7~GQaZrTp+Oyy)Y(4uMC`ELJru2LuCN&W3GfU_yvU94oA}JWIgC~)3PaIXCp4|c}5p-52Y39tf#=h@F zmYZ%6tXxb&I&2{ZOJI#zYmSCtx?F@#`*wBC2kWdub1vmDukQ~Z#|PN3cqOIUiBA~g){I#Vk{-^A9uq|#uZJHm zLn`)#hhP6+Q@Z&ESjwFVUGx08alNdJwU_n!GkT_*ZvLqUQf8K-nw0E>`*L=1Rl47gtdZnW->*G)9%uYXAy7n_1KWnD zzI{9W;rk3;=W8pJelC|@*;yu?tzzT(k7NGc@|qf-q8{(vK^uQ0+3rt#HzU8pv#&qZ z2)Lyo6g1oBlU_5StNSJLM9{_}cu*i(F(8W$w0`@~#KW*zjq_|wYQe~ literal 0 HcmV?d00001 diff --git a/play/img/ballot5_rate.png b/play/img/ballot5_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..8e94c9e136f6a9e07be9e3147c3a48de05867831 GIT binary patch literal 66569 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/F3w(KJpi1gKY~Qq7Q+i%{z6qW&Nu^n;_a# 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 literal 0 HcmV?d00001 diff --git a/play/img/ballot5_three.png b/play/img/ballot5_three.png new file mode 100644 index 0000000000000000000000000000000000000000..bf180fe58a193d316faf1383700295f454370d14 GIT binary patch literal 32885 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 literal 0 HcmV?d00001 diff --git a/play/js/Ballot.js b/play/js/Ballot.js index a68f8600..169ec64f 100644 --- a/play/js/Ballot.js +++ b/play/js/Ballot.js @@ -6,18 +6,29 @@ What does the base Ballot class need to do? ******************/ + +// are we in a sandbox or election? +var url = window.location.pathname; +var filename = url.substring(url.lastIndexOf('/')+1); +var firstletter = filename[0] +var inSandbox = (firstletter == "e" || firstletter == "s") function ScoreBallot(config){ var self = this; config = config || {}; config.bg = "img/ballot_range.png"; + if (inSandbox) { + config.bg = "img/ballot5_range.png"; + } Ballot.call(self, config); // BOXES! self.boxes = { square: self.createRate(133, 100, 0), triangle: self.createRate(133, 143, 3), - hexagon: self.createRate(133, 184, 1) + hexagon: self.createRate(133, 184, 1), + pentagon: self.createRate(133, 226, 1), + bob: self.createRate(133, 268, 1) }; // On update... @@ -35,13 +46,18 @@ function ThreeBallot(config){ var self = this; config = config || {}; config.bg = "img/ballot_range3.png"; + if (inSandbox) { + config.bg = "img/ballot5_range3.png"; + } Ballot.call(self, config); // BOXES! self.boxes = { square: self.createThree(133, 100, 0), triangle: self.createThree(133, 143, 3), - hexagon: self.createThree(133, 184, 1) + hexagon: self.createThree(133, 184, 1), + pentagon: self.createThree(133, 226, 1), + bob: self.createThree(133, 268, 1) }; // On update... @@ -59,13 +75,18 @@ function ApprovalBallot(config){ var self = this; config = config || {}; config.bg = "img/ballot_approval.png"; + if (inSandbox) { + config.bg = "img/ballot5_approval.png"; + } Ballot.call(self, config); // BOXES! self.boxes = { square: self.createBox(26, 98, 0), triangle: self.createBox(26, 140, 1), - hexagon: self.createBox(26, 184, 0) + hexagon: self.createBox(26, 184, 0), + pentagon: self.createBox(26, 228, 0), + bob: self.createBox(26, 272, 0) }; // On update... @@ -92,13 +113,18 @@ function RankedBallot(config){ var self = this; config = config || {}; config.bg = "img/ballot_ranked.png"; + if (inSandbox) { + config.bg = "img/ballot5_ranked.png"; + } Ballot.call(self, config); // BOXES! self.boxes = { square: self.createBox(26, 98, 0), triangle: self.createBox(26, 140, 1), - hexagon: self.createBox(26, 184, 0) + hexagon: self.createBox(26, 184, 0), + pentagon: self.createBox(26, 228, 0), + bob: self.createBox(26, 272, 0) }; // On update... @@ -117,13 +143,18 @@ function PluralityBallot(config){ var self = this; config = config || {}; config.bg = "img/ballot_fptp.png"; + if (inSandbox) { + config.bg = "img/ballot5_fptp.png"; + } Ballot.call(self, config); // BOXES! self.boxes = { square: self.createBox(26, 98, 0), triangle: self.createBox(26, 140, 1), - hexagon: self.createBox(26, 184, 0) + hexagon: self.createBox(26, 184, 0), + pentagon: self.createBox(26, 228, 0), + bob: self.createBox(26, 272, 0) }; // On update... @@ -173,6 +204,14 @@ function Ballot(config){ }; self.createBox = function(x,y,frame){ + if (inSandbox) { + return self.createSprite({ + img: "img/ballot5_box.png", + x:x, y:y, + w:50, h:50, + frame:frame + }); + } return self.createSprite({ img: "img/ballot_box.png", x:x, y:y, @@ -181,6 +220,14 @@ function Ballot(config){ }); }; self.createRate = function(x,y,frame){ + if (inSandbox) { + return self.createSprite({ + img: "img/ballot5_rate.png", + x:x, y:y, + w:225, h:50, + frame:frame + }); + } return self.createSprite({ img: "img/ballot_rate.png", x:x, y:y, @@ -189,6 +236,14 @@ function Ballot(config){ }); }; self.createThree = function(x,y,frame){ + if (inSandbox) { + return self.createSprite({ + img: "img/ballot5_three.png", + x:x, y:y, + w:225, h:50, + frame:frame + }); + } return self.createSprite({ img: "img/ballot_three.png", x:x, y:y, diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index ce5de3fb..a06466fd 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -44,7 +44,10 @@ function main(config){ config.system = config.system || "FPTP"; config.candidates = config.candidates || 3; config.voters = config.voters || 1; - + config.snowman = config.snowman || false; + //config.votersRealName = config.votersRealName || "Single Voter"; + config.oneVoter = config.oneVoter || false; + config.features = config.features || 0; // 1-basic, 2-voters, 3-candidates, 4-save if ( config.features == 0 && ! config.featurelist) {config.featurelist = ["systems"] // old spec } else if (config.features == 1) {config.featurelist = ["systems"] @@ -73,11 +76,10 @@ function main(config){ for (i in [0,1,2]) { config.voterPercentStrategy[i] = config.voterPercentStrategy[i] || 0 } - config.snowman = config.snowman || false; config.unstrategic = config.unstrategic || "zero strategy. judge on an absolute scale."; config.keyyee = config.keyyee || "off"; - config.computeMethod = config.computeMethod || "js"; + config.computeMethod = config.computeMethod || "ez"; var url = window.location.pathname; var filename = url.substring(url.lastIndexOf('/')+1); config.filename = filename @@ -106,6 +108,7 @@ function main(config){ // Based on config... what should be what? model.numOfCandidates = config.candidates; model.numOfVoters = config.voters; + model.votersRealName = voters.filter( function(x){return (x.num==config.voters && (x.snowman||false)==config.snowman && (x.oneVoter||false) == config.oneVoter) })[0].realname model.system = config.system; model.frontrunnerSet = config.frontrunnerSet; model.computeMethod = config.computeMethod; @@ -288,11 +291,11 @@ function main(config){ // How many voters? var voters = [ - {name:"웃", num:1, margin:5, oneVoter:true}, - {name:"1", num:1, margin:5}, - {name:"2", num:2, margin:5}, - {name:"3", num:3, margin:5}, - {name:"☃", num:3, snowman:true}, + {realname: "Single Voter", name:"웃", num:1, margin:5, oneVoter:true}, + {realname: "One Group", name:"1", num:1, margin:5}, + {realname: "Two Groups", name:"2", num:2, margin:5}, + {realname: "Three Groups", name:"3", num:3, margin:5}, + {realname: "Different Sized Groups (like a snowman)", name:"☃", num:3, snowman:true}, ]; var onChooseVoters = function(data){ @@ -301,6 +304,7 @@ function main(config){ config.snowman = data.snowman || false; config.oneVoter = data.oneVoter || false; + model.votersRealName = data.realname; // save candidates before switching! config.candidatePositions = save().candidatePositions; @@ -748,7 +752,7 @@ function main(config){ var selectUI = function(){ if(window.chooseSystem) chooseSystem.highlight("name", model.system); if(window.chooseCandidates) chooseCandidates.highlight("num", model.numOfCandidates); - if(window.chooseVoters) chooseVoters.highlight("num", model.numOfVoters); + if(window.chooseVoters) chooseVoters.highlight("realname", model.votersRealName); if(window.choosePercentStrategy) choosePercentStrategy.highlight("num", model.voters[0].percentStrategy); if(window.chooseVoterStrategyOn) chooseVoterStrategyOn.highlight("realname", model.voters[0].strategy); if(window.chooseVoterStrategyOff) chooseVoterStrategyOff.highlight("realname", model.voters[0].unstrategic); @@ -941,14 +945,14 @@ function main(config){ "img/bob.png", // Ballot instructions - "img/ballot_fptp.png", - "img/ballot_ranked.png", - "img/ballot_approval.png", - "img/ballot_range.png", + "img/ballot5_fptp.png", + "img/ballot5_ranked.png", + "img/ballot5_approval.png", + "img/ballot5_range.png", // The boxes - "img/ballot_box.png", - "img/ballot_rate.png" + "img/ballot5_box.png", + "img/ballot5_rate.png" ]); From 601cc9fcce4cd8aeafe39d59976980faf5b6fb9d Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sat, 12 Aug 2017 23:18:48 -0400 Subject: [PATCH 088/120] better images, alignment of ballot inside sandbox --- newer.html | 24 ++++----- play/css/ballotInSandbox.css | 13 ++--- play/css/election.css | 2 +- play/css/sandbox.css | 2 +- play/img/ballot5_rate.png | Bin 66569 -> 0 bytes play/img/ballot5_three.png | Bin 32885 -> 0 bytes play/img/ballot_rate.png | Bin 66569 -> 127975 bytes play/img/ballot_three.png | Bin 32885 -> 35249 bytes play/js/Ballot.js | 93 ++++++++++++++++++++--------------- play/js/Voters.js | 3 +- play/js/main_sandbox.js | 3 +- 11 files changed, 75 insertions(+), 65 deletions(-) delete mode 100644 play/img/ballot5_rate.png delete mode 100644 play/img/ballot5_three.png diff --git a/newer.html b/newer.html index 163d3914..d286c840 100644 --- a/newer.html +++ b/newer.html @@ -218,7 +218,7 @@

Normalizing Voter

Strategists win

- +
@@ -284,7 +284,7 @@

Not the Worst Frontrunne

Playing Chicken

- +

@@ -302,7 +302,7 @@

Not the Worst Frontrunne

Playing Chicken with Different Methods

- +

@@ -310,7 +310,7 @@

Not the Worst Frontrunne

Center Squeeze

- +

@@ -344,7 +344,7 @@

Star Strong

Chicken Star

- +
@@ -376,7 +376,7 @@

321 Strategic

321 Chicken

- +
@@ -397,7 +397,7 @@

321 Strategic

@@ -665,7 +665,7 @@

SCORE VOTING

- +
@@ -683,7 +683,7 @@

SCORE VOTING

drag the voters slowly up towards :

- +
@@ -716,7 +716,7 @@

SCORE VOTING

drag to just slightly left of :

- +
@@ -744,7 +744,7 @@

SCORE VOTING

move the voters in such a way that NOBODY wins:

- +
@@ -829,7 +829,7 @@

SCORE VOTING

and Johnson wins Borda??

- +
diff --git a/play/css/ballotInSandbox.css b/play/css/ballotInSandbox.css index a783223f..4f6a3ef0 100644 --- a/play/css/ballotInSandbox.css +++ b/play/css/ballotInSandbox.css @@ -2,18 +2,14 @@ BALLOT DESIGN **********************/ -#right{ - width: auto; - height: auto; -} #ballot{ - width: 375px; - height: 350px; + width: 210px; + height: 195px; margin-left: 0px; margin-bottom: 0px; - margin-top: 30px; + margin-top: 0px; background: #F0EAD6; color: #302707; @@ -22,8 +18,7 @@ BALLOT DESIGN border: 2px solid #fff; position: relative; - transform: translate(-50px,-50px) scale(.8); - + } #ballot .ballot_sprite{ diff --git a/play/css/election.css b/play/css/election.css index ae2616cd..afb27238 100644 --- a/play/css/election.css +++ b/play/css/election.css @@ -20,7 +20,7 @@ Election/Sandbox design: height: 370px; } #right{ - width:376px; + width: 220px; padding-left: 20px; overflow-y: auto; } diff --git a/play/css/sandbox.css b/play/css/sandbox.css index d7e82f95..4ef477c9 100644 --- a/play/css/sandbox.css +++ b/play/css/sandbox.css @@ -40,7 +40,7 @@ textarea, input{ position: absolute; top: 471px; left: 460px; - width: 323px; + width: 82px; height: 15px; padding: 8px; font-size: 12px; diff --git a/play/img/ballot5_rate.png b/play/img/ballot5_rate.png deleted file mode 100644 index 8e94c9e136f6a9e07be9e3147c3a48de05867831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66569 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/F3w(KJpi1gKY~Qq7Q+i%{z6qW&Nu^n;_a# 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 diff --git a/play/img/ballot5_three.png b/play/img/ballot5_three.png deleted file mode 100644 index bf180fe58a193d316faf1383700295f454370d14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32885 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 diff --git a/play/img/ballot_rate.png b/play/img/ballot_rate.png index 8e94c9e136f6a9e07be9e3147c3a48de05867831..827ef5e32589317b49a7c16b9012aac73d5fc54c 100644 GIT binary patch literal 127975 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

c_CiD0R;L)ww1~6`NQS=L^ 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�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 j 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

FOMT|1pDL^(u2uPbk2SY-?vU&BA3Ei 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 literal 0 HcmV?d00001 diff --git a/play/js/Presets.js b/play/js/Presets.js index 8e739884..c294f90b 100644 --- a/play/js/Presets.js +++ b/play/js/Presets.js @@ -391,6 +391,87 @@ kindayee: "can", voters: 1, doFullStrategyConfig: true, doPercentFirst: true +} + } else if (htmlname == "ballot1.html") { + config = +{system: "Plurality"} + + } else if (htmlname == "ballot2.html") { + config = +{system: "Ranked"} + + } else if (htmlname == "ballot3.html") { + config = +{system: "Approval"} + + } else if (htmlname == "ballot4.html") { + config = +{system: "Score"} + + } else if (htmlname == "ballot5.html") { + config = +{ + system: "Score", + strategy: "normalize" +} + } else if (htmlname == "ballot6.html") { + config = +{ + system: "Score", + strategy: "best frontrunner", + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true, + showChoiceOfStrategy: true +} + } else if (htmlname == "ballot7.html") { + config = +{ + system: "Score", + strategy: "not the worst frontrunner", + showChoiceOfFrontrunners: true +} + } else if (htmlname == "ballot8.html") { + config = +{ + system: "Score", + strategy: "normalize frontrunners only", + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true, + showChoiceOfStrategy: true +} + } else if (htmlname == "ballot9.html") { + config = +{ + system: "Score", + strategy: "starnormfrontrunners", // for now we are using an "off-menu" option. We should make versions of each of hte strategies for star. + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true +} + } else if (htmlname == "ballot10.html") { + config = +{ + system: "Three", + strategy: "starnormfrontrunners", + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true +} + } else if (htmlname == "ballot11.html") { + config = +{ + system: "Score", + strategy: "best frontrunner", + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true, + showChoiceOfStrategy: true +} + } else if (htmlname == "ballot12.html") { + config = +{ + system: "Score", + strategy: "not the worst frontrunner", + frontrunnerSet: new Set(["square","triangle"]), + showChoiceOfFrontrunners: true, + showChoiceOfStrategy: true } // } else if (htmlname == "election.html") { // config = diff --git a/play/js/Voters.js b/play/js/Voters.js index 86e4e81f..979aa953 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -785,7 +785,9 @@ function SingleVoter(config){ self.num = 1; self.vid = 0; self.snowman = false; + self.percentStrategy = config.percentStrategy self.strategy = config.strategy + self.unstrategic = config.unstrategic self.frontrunnerSet = config.frontrunnerSet diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 6780756a..d2fa2adb 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -665,7 +665,7 @@ function main(config){ for (var i=1;i<=14;i++) {presetnames.push("e"+i) ; presethtmlnames.push("election"+i+".html") ; presetdescription.push("election"+i+".html")} presetnames.push("O") ; presethtmlnames.push(filename) ; presetdescription.push("original intended preset") // TODO - //for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} + for (var i=1;i<=12;i++) {presetnames.push("b"+i) ; presethtmlnames.push("ballot"+i+".html") ; presetdescription.push("ballot"+i+".html")} @@ -683,7 +683,23 @@ function main(config){ setInPosition(); selectUI(); } else if (firstletter == 'b') { - document.location.replace(data.htmlname); + //document.location.replace(data.htmlname); + ballotconfig = loadpreset(data.htmlname) + var systemTranslator = {Plurality:"FPTP",Ranked:"Condorcet",Approval:"Approval",Score:"Score",Three:"3-2-1"} + config = {} + config.system = systemTranslator[ballotconfig.system] + var s = ballotconfig.strategy || "zero strategy. judge on an absolute scale." + config.voterStrategies = [s,s,s] + config.frontrunnerSet = ballotconfig.frontrunnerSet + config.featurelist = [] + if (ballotconfig.showChoiceOfFrontrunners) {config.featurelist.push("frontrunners")} + if (ballotconfig.showChoiceOfStrategy) {config.featurelist.push("strategy")} + config.oneVoter = true + loadDefaults() + model.reset(true); + model.onInit(); + setInPosition(); + selectUI(); } } }; @@ -754,7 +770,11 @@ function main(config){ if(window.chooseCandidates) chooseCandidates.highlight("num", model.numOfCandidates); if(window.chooseVoters) chooseVoters.highlight("realname", model.votersRealName); if(window.choosePercentStrategy) choosePercentStrategy.highlight("num", model.voters[0].percentStrategy); - if(window.chooseVoterStrategyOn) chooseVoterStrategyOn.highlight("realname", model.voters[0].strategy); + if(window.chooseVoterStrategyOn) { + if (model.voters[0].strategy != "starnormfrontrunners") { // kind of a hack for now, but I don't really want another button + chooseVoterStrategyOn.highlight("realname", model.voters[0].strategy); + } + } if(window.chooseVoterStrategyOff) chooseVoterStrategyOff.highlight("realname", model.voters[0].unstrategic); if(window.chooseFrun) chooseFrun.highlight("realname", model.frontrunnerSet); if(stratsliders) { From e78fbad0db42f1b3e6bae4147fb948ede88f1ba0 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 13 Aug 2017 09:58:05 -0400 Subject: [PATCH 090/120] iframe communication: first success in sandbox, very rough. --- play/js/main_sandbox.js | 15 +++++++++++++ sandbox/index.html | 50 +++++++++++++++++++++++++++++++++++++++++ sandbox/sandbox.html | 39 +++++++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index d2fa2adb..90ffe1ff 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -716,6 +716,21 @@ function main(config){ // only do this once. Otherwise it would be in SelectUI + // Also handle messages from the parent window + function bindEvent(element, eventName, eventHandler) { + if (element.addEventListener) { + element.addEventListener(eventName, eventHandler, false); + } else if (element.attachEvent) { + element.attachEvent('on' + eventName, eventHandler); + } + } + // Listen to messages from parent window + bindEvent(window, 'message', function (e) { + onChoosepresetconfig({htmlname:e.data}) + }); + + + var computeMethod = [{name:"gpu",margin:4},{name:"js",margin:4},{name:"ez"}] var onChooseComputeMethod = function(data){ config.computeMethod = data.name diff --git a/sandbox/index.html b/sandbox/index.html index d7e5f10d..633fae7d 100644 --- a/sandbox/index.html +++ b/sandbox/index.html @@ -101,6 +101,56 @@ honestly, is probably for the best.

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 literal 66569 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/F3w(KJpi1gKY~Qq7Q+i%{z6qW&Nu^n;_a# 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 diff --git a/play/img/ballot_three.png b/play/img/ballot_three.png index bf180fe58a193d316faf1383700295f454370d14..90b6abfad9181f5463c89a523083e345365ab3c2 100644 GIT binary patch literal 35249 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 literal 32885 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 diff --git a/play/js/Ballot.js b/play/js/Ballot.js index 169ec64f..9bdf7643 100644 --- a/play/js/Ballot.js +++ b/play/js/Ballot.js @@ -12,6 +12,9 @@ var url = window.location.pathname; var filename = url.substring(url.lastIndexOf('/')+1); var firstletter = filename[0] var inSandbox = (firstletter == "e" || firstletter == "s") +var sc = 1 // scale factor also is present in setting width and height in ballotInSandbox.css +if(inSandbox) {sc = 210/375} + function ScoreBallot(config){ var self = this; @@ -26,16 +29,23 @@ function ScoreBallot(config){ self.boxes = { square: self.createRate(133, 100, 0), triangle: self.createRate(133, 143, 3), - hexagon: self.createRate(133, 184, 1), - pentagon: self.createRate(133, 226, 1), - bob: self.createRate(133, 268, 1) + hexagon: self.createRate(133, 184, 1) + } + if (inSandbox) { + self.boxes["pentagon"] = self.createRate(133, 226, 1) + self.boxes["bob"] = self.createRate(133, 268, 1) }; - + // On update... self.update = function(ballot){ + // Clear all + var vote = ballot.vote; + for(var box in self.boxes){ + self.boxes[box].gotoFrame(0); + } for(var cID in ballot){ var score = ballot[cID]; - self.boxes[cID].gotoFrame(score); + self.boxes[cID].gotoFrame(score+1); } }; @@ -55,16 +65,24 @@ function ThreeBallot(config){ self.boxes = { square: self.createThree(133, 100, 0), triangle: self.createThree(133, 143, 3), - hexagon: self.createThree(133, 184, 1), - pentagon: self.createThree(133, 226, 1), - bob: self.createThree(133, 268, 1) + hexagon: self.createThree(133, 184, 1) + }; + if (inSandbox) { + self.boxes["pentagon"] = self.createThree(133, 226, 1) + self.boxes["bob"] = self.createThree(133, 268, 1) }; // On update... self.update = function(ballot){ + // Clear all + var vote = ballot.vote; + for(var box in self.boxes){ + self.boxes[box].gotoFrame(0); + } + for(var cID in ballot){ var score = ballot[cID]; - self.boxes[cID].gotoFrame(score); + self.boxes[cID].gotoFrame(score+1); } }; @@ -84,9 +102,11 @@ function ApprovalBallot(config){ self.boxes = { square: self.createBox(26, 98, 0), triangle: self.createBox(26, 140, 1), - hexagon: self.createBox(26, 184, 0), - pentagon: self.createBox(26, 228, 0), - bob: self.createBox(26, 272, 0) + hexagon: self.createBox(26, 184, 0) + }; + if (inSandbox) { + self.boxes["pentagon"] = self.createBox(26, 228, 0) + self.boxes["bob"] = self.createBox(26, 272, 0) }; // On update... @@ -122,13 +142,20 @@ function RankedBallot(config){ self.boxes = { square: self.createBox(26, 98, 0), triangle: self.createBox(26, 140, 1), - hexagon: self.createBox(26, 184, 0), - pentagon: self.createBox(26, 228, 0), - bob: self.createBox(26, 272, 0) + hexagon: self.createBox(26, 184, 0) + }; + if (inSandbox) { + self.boxes["pentagon"] = self.createBox(26, 228, 0) + self.boxes["bob"] = self.createBox(26, 272, 0) }; // On update... self.update = function(ballot){ + // Clear all + var vote = ballot.vote; + for(var box in self.boxes){ + self.boxes[box].gotoFrame(0); + } for(var i=0; i Date: Sun, 13 Aug 2017 00:45:04 -0400 Subject: [PATCH 089/120] added ability to access ballot presets from sandbox. --- play/ballot1.html | 2 +- play/ballot10.html | 7 +--- play/ballot11.html | 8 +--- play/ballot12.html | 8 +--- play/ballot2.html | 2 +- play/ballot3.html | 2 +- play/ballot4.html | 2 +- play/ballot5.html | 5 +-- play/ballot6.html | 8 +--- play/ballot7.html | 6 +-- play/ballot8.html | 8 +--- play/ballot9.html | 7 +--- play/img/ballot_rate.png | Bin 127975 -> 127966 bytes play/img/ballot_rate5.png | Bin 0 -> 127975 bytes play/js/Presets.js | 81 ++++++++++++++++++++++++++++++++++++++ play/js/Voters.js | 2 + play/js/main_sandbox.js | 26 ++++++++++-- 17 files changed, 118 insertions(+), 56 deletions(-) create mode 100644 play/img/ballot_rate5.png diff --git a/play/ballot1.html b/play/ballot1.html index 2f0036cc..1dfbd33e 100644 --- a/play/ballot1.html +++ b/play/ballot1.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot10.html b/play/ballot10.html index f5883aaf..b60c2d42 100644 --- a/play/ballot10.html +++ b/play/ballot10.html @@ -22,9 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot11.html b/play/ballot11.html index 582678c4..b60c2d42 100644 --- a/play/ballot11.html +++ b/play/ballot11.html @@ -22,10 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot12.html b/play/ballot12.html index b8b7aae5..b60c2d42 100644 --- a/play/ballot12.html +++ b/play/ballot12.html @@ -22,10 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot2.html b/play/ballot2.html index 5f9d2d6a..1dfbd33e 100644 --- a/play/ballot2.html +++ b/play/ballot2.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot3.html b/play/ballot3.html index 6366037f..1dfbd33e 100644 --- a/play/ballot3.html +++ b/play/ballot3.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot4.html b/play/ballot4.html index 4271633b..1dfbd33e 100644 --- a/play/ballot4.html +++ b/play/ballot4.html @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot5.html b/play/ballot5.html index 376e2418..1dfbd33e 100644 --- a/play/ballot5.html +++ b/play/ballot5.html @@ -20,7 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot6.html b/play/ballot6.html index 582678c4..b60c2d42 100644 --- a/play/ballot6.html +++ b/play/ballot6.html @@ -22,10 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot7.html b/play/ballot7.html index 8bb4e7f4..b60c2d42 100644 --- a/play/ballot7.html +++ b/play/ballot7.html @@ -22,8 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot8.html b/play/ballot8.html index 5b5a2bee..b60c2d42 100644 --- a/play/ballot8.html +++ b/play/ballot8.html @@ -22,10 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/ballot9.html b/play/ballot9.html index af7e41cf..b60c2d42 100644 --- a/play/ballot9.html +++ b/play/ballot9.html @@ -22,9 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/play/img/ballot_rate.png b/play/img/ballot_rate.png index 827ef5e32589317b49a7c16b9012aac73d5fc54c..aef62df24fb95fc5da57efb28c8d03a200c08c85 100644 GIT binary patch delta 124985 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

+ +

Parent Window

+

Send Message:

+

Got Message:

+
+
+ +
\ No newline at end of file diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index 74853656..5cd669ad 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -12,6 +12,43 @@
+ + +

Hello there, i'm an iframe

+

Send Message:

+

Got Message:

+
+ + @@ -34,4 +71,4 @@ - \ No newline at end of file + From 88901316d23000f50e21cb665ada5df7d8be9fe6 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 13 Aug 2017 10:09:07 -0400 Subject: [PATCH 091/120] cleaned up iframe communication --- play/js/main_sandbox.js | 54 ++++++++++++++++++++--------------------- sandbox/index.html | 31 +++-------------------- sandbox/sandbox.html | 36 --------------------------- 3 files changed, 29 insertions(+), 92 deletions(-) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 90ffe1ff..42a8f62d 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -673,34 +673,32 @@ function main(config){ for (i in presetnames) presetconfig.push({name:presetnames[i],realname:presetdescription[i],htmlname:presethtmlnames[i],margin:4}) var onChoosepresetconfig = function(data){ - if (data.isOn) { - var firstletter = data.htmlname[0] - if (firstletter == 'e' || firstletter == 's') { - config = loadpreset(data.htmlname) - loadDefaults() - model.reset(true); - model.onInit(); - setInPosition(); - selectUI(); - } else if (firstletter == 'b') { - //document.location.replace(data.htmlname); - ballotconfig = loadpreset(data.htmlname) - var systemTranslator = {Plurality:"FPTP",Ranked:"Condorcet",Approval:"Approval",Score:"Score",Three:"3-2-1"} - config = {} - config.system = systemTranslator[ballotconfig.system] - var s = ballotconfig.strategy || "zero strategy. judge on an absolute scale." - config.voterStrategies = [s,s,s] - config.frontrunnerSet = ballotconfig.frontrunnerSet - config.featurelist = [] - if (ballotconfig.showChoiceOfFrontrunners) {config.featurelist.push("frontrunners")} - if (ballotconfig.showChoiceOfStrategy) {config.featurelist.push("strategy")} - config.oneVoter = true - loadDefaults() - model.reset(true); - model.onInit(); - setInPosition(); - selectUI(); - } + var firstletter = data.htmlname[0] + if (firstletter == 'e' || firstletter == 's') { + config = loadpreset(data.htmlname) + loadDefaults() + model.reset(true); + model.onInit(); + setInPosition(); + selectUI(); + } else if (firstletter == 'b') { + //document.location.replace(data.htmlname); + ballotconfig = loadpreset(data.htmlname) + var systemTranslator = {Plurality:"FPTP",Ranked:"Condorcet",Approval:"Approval",Score:"Score",Three:"3-2-1"} + config = {} + config.system = systemTranslator[ballotconfig.system] + var s = ballotconfig.strategy || "zero strategy. judge on an absolute scale." + config.voterStrategies = [s,s,s] + config.frontrunnerSet = ballotconfig.frontrunnerSet + config.featurelist = [] + if (ballotconfig.showChoiceOfFrontrunners) {config.featurelist.push("frontrunners")} + if (ballotconfig.showChoiceOfStrategy) {config.featurelist.push("strategy")} + config.oneVoter = true + loadDefaults() + model.reset(true); + model.onInit(); + setInPosition(); + selectUI(); } }; window.choosepresetconfig = new ButtonGroup({ diff --git a/sandbox/index.html b/sandbox/index.html index 633fae7d..b146c328 100644 --- a/sandbox/index.html +++ b/sandbox/index.html @@ -102,12 +102,7 @@

-

Parent Window

-

Send Message:

-

Got Message:

-
-
- +

Send Message:

diff --git a/sandbox/sandbox.html b/sandbox/sandbox.html index 5cd669ad..8f28697c 100644 --- a/sandbox/sandbox.html +++ b/sandbox/sandbox.html @@ -13,42 +13,6 @@
- -

Hello there, i'm an iframe

-

Send Message:

-

Got Message:

-
- - From 52c1c3db978c1e54ff7145287bb757bb372dcedd Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 13 Aug 2017 11:36:28 -0400 Subject: [PATCH 092/120] functional. scrolling triggers a change in the sidebar's election example. --- js/ScrollMagic.js | 2780 +++++++++++++++++++++++++++++++++++++++++++ js/scrolltrigger.js | 32 + newer.html | 15 +- 3 files changed, 2826 insertions(+), 1 deletion(-) create mode 100644 js/ScrollMagic.js create mode 100644 js/scrolltrigger.js diff --git a/js/ScrollMagic.js b/js/ScrollMagic.js new file mode 100644 index 00000000..d3619de0 --- /dev/null +++ b/js/ScrollMagic.js @@ -0,0 +1,2780 @@ +/*! + * ScrollMagic v2.0.5 (2015-04-29) + * The javascript library for magical scroll interactions. + * (c) 2015 Jan Paepke (@janpaepke) + * Project Website: http://scrollmagic.io + * + * @version 2.0.5 + * @license Dual licensed under MIT license and GPL. + * @author Jan Paepke - e-mail@janpaepke.de + * + * @file ScrollMagic main library. + */ +/** + * @namespace ScrollMagic + */ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else if (typeof exports === 'object') { + // CommonJS + module.exports = factory(); + } else { + // Browser global + root.ScrollMagic = factory(); + } +}(this, function () { + "use strict"; + + var ScrollMagic = function () { + _util.log(2, '(COMPATIBILITY NOTICE) -> As of ScrollMagic 2.0.0 you need to use \'new ScrollMagic.Controller()\' to create a new controller instance. Use \'new ScrollMagic.Scene()\' to instance a scene.'); + }; + + ScrollMagic.version = "2.0.5"; + + // TODO: temporary workaround for chrome's scroll jitter bug + window.addEventListener("mousewheel", function () {}); + + // global const + var PIN_SPACER_ATTRIBUTE = "data-scrollmagic-pin-spacer"; + + /** + * The main class that is needed once per scroll container. + * + * @class + * + * @example + * // basic initialization + * var controller = new ScrollMagic.Controller(); + * + * // passing options + * var controller = new ScrollMagic.Controller({container: "#myContainer", loglevel: 3}); + * + * @param {object} [options] - An object containing one or more options for the controller. + * @param {(string|object)} [options.container=window] - A selector, DOM object that references the main container for scrolling. + * @param {boolean} [options.vertical=true] - Sets the scroll mode to vertical (`true`) or horizontal (`false`) scrolling. + * @param {object} [options.globalSceneOptions={}] - These options will be passed to every Scene that is added to the controller using the addScene method. For more information on Scene options see {@link ScrollMagic.Scene}. + * @param {number} [options.loglevel=2] Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic. + ** `0` => silent + ** `1` => errors + ** `2` => errors, warnings + ** `3` => errors, warnings, debuginfo + * @param {boolean} [options.refreshInterval=100] - Some changes don't call events by default, like changing the container size or moving a scene trigger element. + This interval polls these parameters to fire the necessary events. + If you don't use custom containers, trigger elements or have static layouts, where the positions of the trigger elements don't change, you can set this to 0 disable interval checking and improve performance. + * + */ + ScrollMagic.Controller = function (options) { +/* + * ---------------------------------------------------------------- + * settings + * ---------------------------------------------------------------- + */ + var + NAMESPACE = 'ScrollMagic.Controller', + SCROLL_DIRECTION_FORWARD = 'FORWARD', + SCROLL_DIRECTION_REVERSE = 'REVERSE', + SCROLL_DIRECTION_PAUSED = 'PAUSED', + DEFAULT_OPTIONS = CONTROLLER_OPTIONS.defaults; + +/* + * ---------------------------------------------------------------- + * private vars + * ---------------------------------------------------------------- + */ + var + Controller = this, + _options = _util.extend({}, DEFAULT_OPTIONS, options), + _sceneObjects = [], + _updateScenesOnNextCycle = false, + // can be boolean (true => all scenes) or an array of scenes to be updated + _scrollPos = 0, + _scrollDirection = SCROLL_DIRECTION_PAUSED, + _isDocument = true, + _viewPortSize = 0, + _enabled = true, + _updateTimeout, _refreshTimeout; + +/* + * ---------------------------------------------------------------- + * private functions + * ---------------------------------------------------------------- + */ + + /** + * Internal constructor function of the ScrollMagic Controller + * @private + */ + var construct = function () { + for (var key in _options) { + if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { + log(2, "WARNING: Unknown option \"" + key + "\""); + delete _options[key]; + } + } + _options.container = _util.get.elements(_options.container)[0]; + // check ScrollContainer + if (!_options.container) { + log(1, "ERROR creating object " + NAMESPACE + ": No valid scroll container supplied"); + throw NAMESPACE + " init failed."; // cancel + } + _isDocument = _options.container === window || _options.container === document.body || !document.body.contains(_options.container); + // normalize to window + if (_isDocument) { + _options.container = window; + } + // update container size immediately + _viewPortSize = getViewportSize(); + // set event handlers + _options.container.addEventListener("resize", onChange); + _options.container.addEventListener("scroll", onChange); + + _options.refreshInterval = parseInt(_options.refreshInterval) || DEFAULT_OPTIONS.refreshInterval; + scheduleRefresh(); + + log(3, "added new " + NAMESPACE + " controller (v" + ScrollMagic.version + ")"); + }; + + /** + * Schedule the next execution of the refresh function + * @private + */ + var scheduleRefresh = function () { + if (_options.refreshInterval > 0) { + _refreshTimeout = window.setTimeout(refresh, _options.refreshInterval); + } + }; + + /** + * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)` + * @private + */ + var getScrollPos = function () { + return _options.vertical ? _util.get.scrollTop(_options.container) : _util.get.scrollLeft(_options.container); + }; + + /** + * Returns the current viewport Size (width vor horizontal, height for vertical) + * @private + */ + var getViewportSize = function () { + return _options.vertical ? _util.get.height(_options.container) : _util.get.width(_options.container); + }; + + /** + * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)` + * Make available publicly for pinned mousewheel workaround. + * @private + */ + var setScrollPos = this._setScrollPos = function (pos) { + if (_options.vertical) { + if (_isDocument) { + window.scrollTo(_util.get.scrollLeft(), pos); + } else { + _options.container.scrollTop = pos; + } + } else { + if (_isDocument) { + window.scrollTo(pos, _util.get.scrollTop()); + } else { + _options.container.scrollLeft = pos; + } + } + }; + + /** + * Handle updates in cycles instead of on scroll (performance) + * @private + */ + var updateScenes = function () { + if (_enabled && _updateScenesOnNextCycle) { + // determine scenes to update + var scenesToUpdate = _util.type.Array(_updateScenesOnNextCycle) ? _updateScenesOnNextCycle : _sceneObjects.slice(0); + // reset scenes + _updateScenesOnNextCycle = false; + var oldScrollPos = _scrollPos; + // update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll) + _scrollPos = Controller.scrollPos(); + var deltaScroll = _scrollPos - oldScrollPos; + if (deltaScroll !== 0) { // scroll position changed? + _scrollDirection = (deltaScroll > 0) ? SCROLL_DIRECTION_FORWARD : SCROLL_DIRECTION_REVERSE; + } + // reverse order of scenes if scrolling reverse + if (_scrollDirection === SCROLL_DIRECTION_REVERSE) { + scenesToUpdate.reverse(); + } + // update scenes + scenesToUpdate.forEach(function (scene, index) { + log(3, "updating Scene " + (index + 1) + "/" + scenesToUpdate.length + " (" + _sceneObjects.length + " total)"); + scene.update(true); + }); + if (scenesToUpdate.length === 0 && _options.loglevel >= 3) { + log(3, "updating 0 Scenes (nothing added to controller)"); + } + } + }; + + /** + * Initializes rAF callback + * @private + */ + var debounceUpdate = function () { + _updateTimeout = _util.rAF(updateScenes); + }; + + /** + * Handles Container changes + * @private + */ + var onChange = function (e) { + log(3, "event fired causing an update:", e.type); + if (e.type == "resize") { + // resize + _viewPortSize = getViewportSize(); + _scrollDirection = SCROLL_DIRECTION_PAUSED; + } + // schedule update + if (_updateScenesOnNextCycle !== true) { + _updateScenesOnNextCycle = true; + debounceUpdate(); + } + }; + + var refresh = function () { + if (!_isDocument) { + // simulate resize event. Only works for viewport relevant param (performance) + if (_viewPortSize != getViewportSize()) { + var resizeEvent; + try { + resizeEvent = new Event('resize', { + bubbles: false, + cancelable: false + }); + } catch (e) { // stupid IE + resizeEvent = document.createEvent("Event"); + resizeEvent.initEvent("resize", false, false); + } + _options.container.dispatchEvent(resizeEvent); + } + } + _sceneObjects.forEach(function (scene, index) { // refresh all scenes + scene.refresh(); + }); + scheduleRefresh(); + }; + + /** + * Send a debug message to the console. + * provided publicly with _log for plugins + * @private + * + * @param {number} loglevel - The loglevel required to initiate output for the message. + * @param {...mixed} output - One or more variables that should be passed to the console. + */ + var log = this._log = function (loglevel, output) { + if (_options.loglevel >= loglevel) { + Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->"); + _util.log.apply(window, arguments); + } + }; + // for scenes we have getters for each option, but for the controller we don't, so we need to make it available externally for plugins + this._options = _options; + + /** + * Sort scenes in ascending order of their start offset. + * @private + * + * @param {array} ScenesArray - an array of ScrollMagic Scenes that should be sorted + * @return {array} The sorted array of Scenes. + */ + var sortScenes = function (ScenesArray) { + if (ScenesArray.length <= 1) { + return ScenesArray; + } else { + var scenes = ScenesArray.slice(0); + scenes.sort(function (a, b) { + return a.scrollOffset() > b.scrollOffset() ? 1 : -1; + }); + return scenes; + } + }; + + /** + * ---------------------------------------------------------------- + * public functions + * ---------------------------------------------------------------- + */ + + /** + * Add one ore more scene(s) to the controller. + * This is the equivalent to `Scene.addTo(controller)`. + * @public + * @example + * // with a previously defined scene + * controller.addScene(scene); + * + * // with a newly created scene. + * controller.addScene(new ScrollMagic.Scene({duration : 0})); + * + * // adding multiple scenes + * controller.addScene([scene, scene2, new ScrollMagic.Scene({duration : 0})]); + * + * @param {(ScrollMagic.Scene|array)} newScene - ScrollMagic Scene or Array of Scenes to be added to the controller. + * @return {Controller} Parent object for chaining. + */ + this.addScene = function (newScene) { + if (_util.type.Array(newScene)) { + newScene.forEach(function (scene, index) { + Controller.addScene(scene); + }); + } else if (newScene instanceof ScrollMagic.Scene) { + if (newScene.controller() !== Controller) { + newScene.addTo(Controller); + } else if (_sceneObjects.indexOf(newScene) < 0) { + // new scene + _sceneObjects.push(newScene); // add to array + _sceneObjects = sortScenes(_sceneObjects); // sort + newScene.on("shift.controller_sort", function () { // resort whenever scene moves + _sceneObjects = sortScenes(_sceneObjects); + }); + // insert Global defaults. + for (var key in _options.globalSceneOptions) { + if (newScene[key]) { + newScene[key].call(newScene, _options.globalSceneOptions[key]); + } + } + log(3, "adding Scene (now " + _sceneObjects.length + " total)"); + } + } else { + log(1, "ERROR: invalid argument supplied for '.addScene()'"); + } + return Controller; + }; + + /** + * Remove one ore more scene(s) from the controller. + * This is the equivalent to `Scene.remove()`. + * @public + * @example + * // remove a scene from the controller + * controller.removeScene(scene); + * + * // remove multiple scenes from the controller + * controller.removeScene([scene, scene2, scene3]); + * + * @param {(ScrollMagic.Scene|array)} Scene - ScrollMagic Scene or Array of Scenes to be removed from the controller. + * @returns {Controller} Parent object for chaining. + */ + this.removeScene = function (Scene) { + if (_util.type.Array(Scene)) { + Scene.forEach(function (scene, index) { + Controller.removeScene(scene); + }); + } else { + var index = _sceneObjects.indexOf(Scene); + if (index > -1) { + Scene.off("shift.controller_sort"); + _sceneObjects.splice(index, 1); + log(3, "removing Scene (now " + _sceneObjects.length + " left)"); + Scene.remove(); + } + } + return Controller; + }; + + /** + * Update one ore more scene(s) according to the scroll position of the container. + * This is the equivalent to `Scene.update()`. + * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. + * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress. + * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._ + * @public + * @example + * // update a specific scene on next cycle + * controller.updateScene(scene); + * + * // update a specific scene immediately + * controller.updateScene(scene, true); + * + * // update multiple scenes scene on next cycle + * controller.updateScene([scene1, scene2, scene3]); + * + * @param {ScrollMagic.Scene} Scene - ScrollMagic Scene or Array of Scenes that is/are supposed to be updated. + * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle. + This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes). + * @return {Controller} Parent object for chaining. + */ + this.updateScene = function (Scene, immediately) { + if (_util.type.Array(Scene)) { + Scene.forEach(function (scene, index) { + Controller.updateScene(scene, immediately); + }); + } else { + if (immediately) { + Scene.update(true); + } else if (_updateScenesOnNextCycle !== true && Scene instanceof ScrollMagic.Scene) { // if _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update + // prep array for next update cycle + _updateScenesOnNextCycle = _updateScenesOnNextCycle || []; + if (_updateScenesOnNextCycle.indexOf(Scene) == -1) { + _updateScenesOnNextCycle.push(Scene); + } + _updateScenesOnNextCycle = sortScenes(_updateScenesOnNextCycle); // sort + debounceUpdate(); + } + } + return Controller; + }; + + /** + * Updates the controller params and calls updateScene on every scene, that is attached to the controller. + * See `Controller.updateScene()` for more information about what this means. + * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll. + * The only application for this method is when ScrollMagic fails to detect these events. + * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes. + * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details. + * @public + * @example + * // update the controller on next cycle (saves performance due to elimination of redundant updates) + * controller.update(); + * + * // update the controller immediately + * controller.update(true); + * + * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance) + * @return {Controller} Parent object for chaining. + */ + this.update = function (immediately) { + onChange({ + type: "resize" + }); // will update size and set _updateScenesOnNextCycle to true + if (immediately) { + updateScenes(); + } + return Controller; + }; + + /** + * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling. + * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset. + * @public + * + * @since 1.1.0 + * @example + * // scroll to an offset of 100 + * controller.scrollTo(100); + * + * // scroll to a DOM element + * controller.scrollTo("#anchor"); + * + * // scroll to the beginning of a scene + * var scene = new ScrollMagic.Scene({offset: 200}); + * controller.scrollTo(scene); + * + * // define a new scroll position modification function (jQuery animate instead of jump) + * controller.scrollTo(function (newScrollPos) { + * $("html, body").animate({scrollTop: newScrollPos}); + * }); + * controller.scrollTo(100); // call as usual, but the new function will be used instead + * + * // define a new scroll function with an additional parameter + * controller.scrollTo(function (newScrollPos, message) { + * console.log(message); + * $(this).animate({scrollTop: newScrollPos}); + * }); + * // call as usual, but supply an extra parameter to the defined custom function + * controller.scrollTo(100, "my message"); + * + * // define a new scroll function with an additional parameter containing multiple variables + * controller.scrollTo(function (newScrollPos, options) { + * someGlobalVar = options.a + options.b; + * $(this).animate({scrollTop: newScrollPos}); + * }); + * // call as usual, but supply an extra parameter containing multiple options + * controller.scrollTo(100, {a: 1, b: 2}); + * + * // define a new scroll function with a callback supplied as an additional parameter + * controller.scrollTo(function (newScrollPos, callback) { + * $(this).animate({scrollTop: newScrollPos}, 400, "swing", callback); + * }); + * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function + * controller.scrollTo(100, function() { + * console.log("scroll has finished."); + * }); + * + * @param {mixed} scrollTarget - The supplied argument can be one of these types: + * 1. `number` -> The container will scroll to this new scroll offset. + * 2. `string` or `object` -> Can be a selector or a DOM object. + * The container will scroll to the position of this element. + * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene. + * 4. `function` -> This function will be used for future scroll position modifications. + * This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`. + * It may also optionally receive an optional additional parameter (see below) + * _**NOTE:** + * All other options will still work as expected, using the new function to scroll._ + * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function. + * @returns {Controller} Parent object for chaining. + */ + this.scrollTo = function (scrollTarget, additionalParameter) { + if (_util.type.Number(scrollTarget)) { // excecute + setScrollPos.call(_options.container, scrollTarget, additionalParameter); + } else if (scrollTarget instanceof ScrollMagic.Scene) { // scroll to scene + if (scrollTarget.controller() === Controller) { // check if the controller is associated with this scene + Controller.scrollTo(scrollTarget.scrollOffset(), additionalParameter); + } else { + log(2, "scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.", scrollTarget); + } + } else if (_util.type.Function(scrollTarget)) { // assign new scroll function + setScrollPos = scrollTarget; + } else { // scroll to element + var elem = _util.get.elements(scrollTarget)[0]; + if (elem) { + // if parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements. + while (elem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { + elem = elem.parentNode; + } + + var + param = _options.vertical ? "top" : "left", + // which param is of interest ? + containerOffset = _util.get.offset(_options.container), + // container position is needed because element offset is returned in relation to document, not in relation to container. + elementOffset = _util.get.offset(elem); + + if (!_isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent + containerOffset[param] -= Controller.scrollPos(); + } + + Controller.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter); + } else { + log(2, "scrollTo(): The supplied argument is invalid. Scroll cancelled.", scrollTarget); + } + } + return Controller; + }; + + /** + * **Get** the current scrollPosition or **Set** a new method to calculate it. + * -> **GET**: + * When used as a getter this function will return the current scroll position. + * To get a cached value use Controller.info("scrollPos"), which will be updated in the update cycle. + * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset. + * + * -> **SET**: + * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation. + * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container. + * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll. + * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position. + * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals. + * + * To change the current scroll position please use `Controller.scrollTo()`. + * @public + * + * @example + * // get the current scroll Position + * var scrollPos = controller.scrollPos(); + * + * // set a new scroll position calculation method + * controller.scrollPos(function () { + * return this.info("vertical") ? -mychildcontainer.y : -mychildcontainer.x + * }); + * + * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container. + * @returns {(number|Controller)} Current scroll position or parent object for chaining. + */ + this.scrollPos = function (scrollPosMethod) { + if (!arguments.length) { // get + return getScrollPos.call(Controller); + } else { // set + if (_util.type.Function(scrollPosMethod)) { + getScrollPos = scrollPosMethod; + } else { + log(2, "Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'."); + } + } + return Controller; + }; + + /** + * **Get** all infos or one in particular about the controller. + * @public + * @example + * // returns the current scroll position (number) + * var scrollPos = controller.info("scrollPos"); + * + * // returns all infos as an object + * var infos = controller.info(); + * + * @param {string} [about] - If passed only this info will be returned instead of an object containing all. + Valid options are: + ** `"size"` => the current viewport size of the container + ** `"vertical"` => true if vertical scrolling, otherwise false + ** `"scrollPos"` => the current scroll position + ** `"scrollDirection"` => the last known direction of the scroll + ** `"container"` => the container element + ** `"isDocument"` => true if container element is the document. + * @returns {(mixed|object)} The requested info(s). + */ + this.info = function (about) { + var values = { + size: _viewPortSize, + // contains height or width (in regard to orientation); + vertical: _options.vertical, + scrollPos: _scrollPos, + scrollDirection: _scrollDirection, + container: _options.container, + isDocument: _isDocument + }; + if (!arguments.length) { // get all as an object + return values; + } else if (values[about] !== undefined) { + return values[about]; + } else { + log(1, "ERROR: option \"" + about + "\" is not available"); + return; + } + }; + + /** + * **Get** or **Set** the current loglevel option value. + * @public + * + * @example + * // get the current value + * var loglevel = controller.loglevel(); + * + * // set a new value + * controller.loglevel(3); + * + * @param {number} [newLoglevel] - The new loglevel setting of the Controller. `[0-3]` + * @returns {(number|Controller)} Current loglevel or parent object for chaining. + */ + this.loglevel = function (newLoglevel) { + if (!arguments.length) { // get + return _options.loglevel; + } else if (_options.loglevel != newLoglevel) { // set + _options.loglevel = newLoglevel; + } + return Controller; + }; + + /** + * **Get** or **Set** the current enabled state of the controller. + * This can be used to disable all Scenes connected to the controller without destroying or removing them. + * @public + * + * @example + * // get the current value + * var enabled = controller.enabled(); + * + * // disable the controller + * controller.enabled(false); + * + * @param {boolean} [newState] - The new enabled state of the controller `true` or `false`. + * @returns {(boolean|Controller)} Current enabled state or parent object for chaining. + */ + this.enabled = function (newState) { + if (!arguments.length) { // get + return _enabled; + } else if (_enabled != newState) { // set + _enabled = !! newState; + Controller.updateScene(_sceneObjects, true); + } + return Controller; + }; + + /** + * Destroy the Controller, all Scenes and everything. + * @public + * + * @example + * // without resetting the scenes + * controller = controller.destroy(); + * + * // with scene reset + * controller = controller.destroy(true); + * + * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset. + * @returns {null} Null to unset handler variables. + */ + this.destroy = function (resetScenes) { + window.clearTimeout(_refreshTimeout); + var i = _sceneObjects.length; + while (i--) { + _sceneObjects[i].destroy(resetScenes); + } + _options.container.removeEventListener("resize", onChange); + _options.container.removeEventListener("scroll", onChange); + _util.cAF(_updateTimeout); + log(3, "destroyed " + NAMESPACE + " (reset: " + (resetScenes ? "true" : "false") + ")"); + return null; + }; + + // INIT + construct(); + return Controller; + }; + + // store pagewide controller options + var CONTROLLER_OPTIONS = { + defaults: { + container: window, + vertical: true, + globalSceneOptions: {}, + loglevel: 2, + refreshInterval: 100 + } + }; +/* + * method used to add an option to ScrollMagic Scenes. + */ + ScrollMagic.Controller.addOption = function (name, defaultValue) { + CONTROLLER_OPTIONS.defaults[name] = defaultValue; + }; + // instance extension function for plugins + ScrollMagic.Controller.extend = function (extension) { + var oldClass = this; + ScrollMagic.Controller = function () { + oldClass.apply(this, arguments); + this.$super = _util.extend({}, this); // copy parent state + return extension.apply(this, arguments) || this; + }; + _util.extend(ScrollMagic.Controller, oldClass); // copy properties + ScrollMagic.Controller.prototype = oldClass.prototype; // copy prototype + ScrollMagic.Controller.prototype.constructor = ScrollMagic.Controller; // restore constructor + }; + + + /** + * A Scene defines where the controller should react and how. + * + * @class + * + * @example + * // create a standard scene and add it to a controller + * new ScrollMagic.Scene() + * .addTo(controller); + * + * // create a scene with custom options and assign a handler to it. + * var scene = new ScrollMagic.Scene({ + * duration: 100, + * offset: 200, + * triggerHook: "onEnter", + * reverse: false + * }); + * + * @param {object} [options] - Options for the Scene. The options can be updated at any time. + Instead of setting the options for each scene individually you can also set them globally in the controller as the controllers `globalSceneOptions` option. The object accepts the same properties as the ones below. + When a scene is added to the controller the options defined using the Scene constructor will be overwritten by those set in `globalSceneOptions`. + * @param {(number|function)} [options.duration=0] - The duration of the scene. + If `0` tweens will auto-play when reaching the scene start point, pins will be pinned indefinetly starting at the start position. + A function retuning the duration value is also supported. Please see `Scene.duration()` for details. + * @param {number} [options.offset=0] - Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the start of the page, after which the scene will start. + * @param {(string|object)} [options.triggerElement=null] - Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start of the page (unless an offset is set). + * @param {(number|string)} [options.triggerHook="onCenter"] - Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport. + Can also be defined using a string: + ** `"onEnter"` => `1` + ** `"onCenter"` => `0.5` + ** `"onLeave"` => `0` + * @param {boolean} [options.reverse=true] - Should the scene reverse, when scrolling up? + * @param {number} [options.loglevel=2] - Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic. + ** `0` => silent + ** `1` => errors + ** `2` => errors, warnings + ** `3` => errors, warnings, debuginfo + * + */ + ScrollMagic.Scene = function (options) { + +/* + * ---------------------------------------------------------------- + * settings + * ---------------------------------------------------------------- + */ + + var + NAMESPACE = 'ScrollMagic.Scene', + SCENE_STATE_BEFORE = 'BEFORE', + SCENE_STATE_DURING = 'DURING', + SCENE_STATE_AFTER = 'AFTER', + DEFAULT_OPTIONS = SCENE_OPTIONS.defaults; + +/* + * ---------------------------------------------------------------- + * private vars + * ---------------------------------------------------------------- + */ + + var + Scene = this, + _options = _util.extend({}, DEFAULT_OPTIONS, options), + _state = SCENE_STATE_BEFORE, + _progress = 0, + _scrollOffset = { + start: 0, + end: 0 + }, + // reflects the controllers's scroll position for the start and end of the scene respectively + _triggerPos = 0, + _enabled = true, + _durationUpdateMethod, _controller; + + /** + * Internal constructor function of the ScrollMagic Scene + * @private + */ + var construct = function () { + for (var key in _options) { // check supplied options + if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { + log(2, "WARNING: Unknown option \"" + key + "\""); + delete _options[key]; + } + } + // add getters/setters for all possible options + for (var optionName in DEFAULT_OPTIONS) { + addSceneOption(optionName); + } + // validate all options + validateOption(); + }; + +/* + * ---------------------------------------------------------------- + * Event Management + * ---------------------------------------------------------------- + */ + + var _listeners = {}; + /** + * Scene start event. + * Fires whenever the scroll position its the starting point of the scene. + * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback. + * + * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. + * + * @event ScrollMagic.Scene#start + * + * @example + * scene.on("start", function (event) { + * console.log("Hit start point of scene."); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.progress - Reflects the current progress of the scene + * @property {string} event.state - The current state of the scene `"BEFORE"` or `"DURING"` + * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` + */ + /** + * Scene end event. + * Fires whenever the scroll position its the ending point of the scene. + * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback. + * + * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. + * + * @event ScrollMagic.Scene#end + * + * @example + * scene.on("end", function (event) { + * console.log("Hit end point of scene."); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.progress - Reflects the current progress of the scene + * @property {string} event.state - The current state of the scene `"DURING"` or `"AFTER"` + * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` + */ + /** + * Scene enter event. + * Fires whenever the scene enters the "DURING" state. + * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction. + * + * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. + * + * @event ScrollMagic.Scene#enter + * + * @example + * scene.on("enter", function (event) { + * console.log("Scene entered."); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.progress - Reflects the current progress of the scene + * @property {string} event.state - The current state of the scene - always `"DURING"` + * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` + */ + /** + * Scene leave event. + * Fires whenever the scene's state goes from "DURING" to either "BEFORE" or "AFTER". + * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction. + * + * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. + * + * @event ScrollMagic.Scene#leave + * + * @example + * scene.on("leave", function (event) { + * console.log("Scene left."); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.progress - Reflects the current progress of the scene + * @property {string} event.state - The current state of the scene `"BEFORE"` or `"AFTER"` + * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` + */ + /** + * Scene update event. + * Fires whenever the scene is updated (but not necessarily changes the progress). + * + * @event ScrollMagic.Scene#update + * + * @example + * scene.on("update", function (event) { + * console.log("Scene updated."); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.startPos - The starting position of the scene (in relation to the conainer) + * @property {number} event.endPos - The ending position of the scene (in relation to the conainer) + * @property {number} event.scrollPos - The current scroll position of the container + */ + /** + * Scene progress event. + * Fires whenever the progress of the scene changes. + * + * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method. + * + * @event ScrollMagic.Scene#progress + * + * @example + * scene.on("progress", function (event) { + * console.log("Scene progress changed to " + event.progress); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {number} event.progress - Reflects the current progress of the scene + * @property {string} event.state - The current state of the scene `"BEFORE"`, `"DURING"` or `"AFTER"` + * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"` + */ + /** + * Scene change event. + * Fires whenvever a property of the scene is changed. + * + * @event ScrollMagic.Scene#change + * + * @example + * scene.on("change", function (event) { + * console.log("Scene Property \"" + event.what + "\" changed to " + event.newval); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {string} event.what - Indicates what value has been changed + * @property {mixed} event.newval - The new value of the changed property + */ + /** + * Scene shift event. + * Fires whenvever the start or end **scroll offset** of the scene change. + * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`. + * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases). + * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`. + * + * @event ScrollMagic.Scene#shift + * @since 1.1.0 + * + * @example + * scene.on("shift", function (event) { + * console.log("Scene moved, because the " + event.reason + " has changed.)"); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {string} event.reason - Indicates why the scene has shifted + */ + /** + * Scene destroy event. + * Fires whenvever the scene is destroyed. + * This can be used to tidy up custom behaviour used in events. + * + * @event ScrollMagic.Scene#destroy + * @since 1.1.0 + * + * @example + * scene.on("enter", function (event) { + * // add custom action + * $("#my-elem").left("200"); + * }) + * .on("destroy", function (event) { + * // reset my element to start position + * if (event.reset) { + * $("#my-elem").left("0"); + * } + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`. + */ + /** + * Scene add event. + * Fires when the scene is added to a controller. + * This is mostly used by plugins to know that change might be due. + * + * @event ScrollMagic.Scene#add + * @since 2.0.0 + * + * @example + * scene.on("add", function (event) { + * console.log('Scene was added to a new controller.'); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + * @property {boolean} event.controller - The controller object the scene was added to. + */ + /** + * Scene remove event. + * Fires when the scene is removed from a controller. + * This is mostly used by plugins to know that change might be due. + * + * @event ScrollMagic.Scene#remove + * @since 2.0.0 + * + * @example + * scene.on("remove", function (event) { + * console.log('Scene was removed from its controller.'); + * }); + * + * @property {object} event - The event Object passed to each callback + * @property {string} event.type - The name of the event + * @property {Scene} event.target - The Scene object that triggered this event + */ + + /** + * Add one ore more event listener. + * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback. + * @method ScrollMagic.Scene#on + * + * @example + * function callback (event) { + * console.log("Event fired! (" + event.type + ")"); + * } + * // add listeners + * scene.on("change update progress start end enter leave", callback); + * + * @param {string} names - The name or names of the event the callback should be attached to. + * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback. + * @returns {Scene} Parent object for chaining. + */ + this.on = function (names, callback) { + if (_util.type.Function(callback)) { + names = names.trim().split(' '); + names.forEach(function (fullname) { + var + nameparts = fullname.split('.'), + eventname = nameparts[0], + namespace = nameparts[1]; + if (eventname != "*") { // disallow wildcards + if (!_listeners[eventname]) { + _listeners[eventname] = []; + } + _listeners[eventname].push({ + namespace: namespace || '', + callback: callback + }); + } + }); + } else { + log(1, "ERROR when calling '.on()': Supplied callback for '" + names + "' is not a valid function!"); + } + return Scene; + }; + + /** + * Remove one or more event listener. + * @method ScrollMagic.Scene#off + * + * @example + * function callback (event) { + * console.log("Event fired! (" + event.type + ")"); + * } + * // add listeners + * scene.on("change update", callback); + * // remove listeners + * scene.off("change update", callback); + * + * @param {string} names - The name or names of the event that should be removed. + * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed. + * @returns {Scene} Parent object for chaining. + */ + this.off = function (names, callback) { + if (!names) { + log(1, "ERROR: Invalid event name supplied."); + return Scene; + } + names = names.trim().split(' '); + names.forEach(function (fullname, key) { + var + nameparts = fullname.split('.'), + eventname = nameparts[0], + namespace = nameparts[1] || '', + removeList = eventname === '*' ? Object.keys(_listeners) : [eventname]; + removeList.forEach(function (remove) { + var + list = _listeners[remove] || [], + i = list.length; + while (i--) { + var listener = list[i]; + if (listener && (namespace === listener.namespace || namespace === '*') && (!callback || callback == listener.callback)) { + list.splice(i, 1); + } + } + if (!list.length) { + delete _listeners[remove]; + } + }); + }); + return Scene; + }; + + /** + * Trigger an event. + * @method ScrollMagic.Scene#trigger + * + * @example + * this.trigger("change"); + * + * @param {string} name - The name of the event that should be triggered. + * @param {object} [vars] - An object containing info that should be passed to the callback. + * @returns {Scene} Parent object for chaining. + */ + this.trigger = function (name, vars) { + if (name) { + var + nameparts = name.trim().split('.'), + eventname = nameparts[0], + namespace = nameparts[1], + listeners = _listeners[eventname]; + log(3, 'event fired:', eventname, vars ? "->" : '', vars || ''); + if (listeners) { + listeners.forEach(function (listener, key) { + if (!namespace || namespace === listener.namespace) { + listener.callback.call(Scene, new ScrollMagic.Event(eventname, listener.namespace, Scene, vars)); + } + }); + } + } else { + log(1, "ERROR: Invalid event name supplied."); + } + return Scene; + }; + + // set event listeners + Scene.on("change.internal", function (e) { + if (e.what !== "loglevel" && e.what !== "tweenChanges") { // no need for a scene update scene with these options... + if (e.what === "triggerElement") { + updateTriggerElementPosition(); + } else if (e.what === "reverse") { // the only property left that may have an impact on the current scene state. Everything else is handled by the shift event. + Scene.update(); + } + } + }).on("shift.internal", function (e) { + updateScrollOffset(); + Scene.update(); // update scene to reflect new position + }); + + /** + * Send a debug message to the console. + * @private + * but provided publicly with _log for plugins + * + * @param {number} loglevel - The loglevel required to initiate output for the message. + * @param {...mixed} output - One or more variables that should be passed to the console. + */ + var log = this._log = function (loglevel, output) { + if (_options.loglevel >= loglevel) { + Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->"); + _util.log.apply(window, arguments); + } + }; + + /** + * Add the scene to a controller. + * This is the equivalent to `Controller.addScene(scene)`. + * @method ScrollMagic.Scene#addTo + * + * @example + * // add a scene to a ScrollMagic Controller + * scene.addTo(controller); + * + * @param {ScrollMagic.Controller} controller - The controller to which the scene should be added. + * @returns {Scene} Parent object for chaining. + */ + this.addTo = function (controller) { + if (!(controller instanceof ScrollMagic.Controller)) { + log(1, "ERROR: supplied argument of 'addTo()' is not a valid ScrollMagic Controller"); + } else if (_controller != controller) { + // new controller + if (_controller) { // was associated to a different controller before, so remove it... + _controller.removeScene(Scene); + } + _controller = controller; + validateOption(); + updateDuration(true); + updateTriggerElementPosition(true); + updateScrollOffset(); + _controller.info("container").addEventListener('resize', onContainerResize); + controller.addScene(Scene); + Scene.trigger("add", { + controller: _controller + }); + log(3, "added " + NAMESPACE + " to controller"); + Scene.update(); + } + return Scene; + }; + + /** + * **Get** or **Set** the current enabled state of the scene. + * This can be used to disable this scene without removing or destroying it. + * @method ScrollMagic.Scene#enabled + * + * @example + * // get the current value + * var enabled = scene.enabled(); + * + * // disable the scene + * scene.enabled(false); + * + * @param {boolean} [newState] - The new enabled state of the scene `true` or `false`. + * @returns {(boolean|Scene)} Current enabled state or parent object for chaining. + */ + this.enabled = function (newState) { + if (!arguments.length) { // get + return _enabled; + } else if (_enabled != newState) { // set + _enabled = !! newState; + Scene.update(true); + } + return Scene; + }; + + /** + * Remove the scene from the controller. + * This is the equivalent to `Controller.removeScene(scene)`. + * The scene will not be updated anymore until you readd it to a controller. + * To remove the pin or the tween you need to call removeTween() or removePin() respectively. + * @method ScrollMagic.Scene#remove + * @example + * // remove the scene from its controller + * scene.remove(); + * + * @returns {Scene} Parent object for chaining. + */ + this.remove = function () { + if (_controller) { + _controller.info("container").removeEventListener('resize', onContainerResize); + var tmpParent = _controller; + _controller = undefined; + tmpParent.removeScene(Scene); + Scene.trigger("remove"); + log(3, "removed " + NAMESPACE + " from controller"); + } + return Scene; + }; + + /** + * Destroy the scene and everything. + * @method ScrollMagic.Scene#destroy + * @example + * // destroy the scene without resetting the pin and tween to their initial positions + * scene = scene.destroy(); + * + * // destroy the scene and reset the pin and tween + * scene = scene.destroy(true); + * + * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset. + * @returns {null} Null to unset handler variables. + */ + this.destroy = function (reset) { + Scene.trigger("destroy", { + reset: reset + }); + Scene.remove(); + Scene.off("*.*"); + log(3, "destroyed " + NAMESPACE + " (reset: " + (reset ? "true" : "false") + ")"); + return null; + }; + + + /** + * Updates the Scene to reflect the current state. + * This is the equivalent to `Controller.updateScene(scene, immediately)`. + * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container. + * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress. + * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last. + * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._ + * @method ScrollMagic.Scene#update + * @example + * // update the scene on next tick + * scene.update(); + * + * // update the scene immediately + * scene.update(true); + * + * @fires Scene.update + * + * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance). + * @returns {Scene} Parent object for chaining. + */ + this.update = function (immediately) { + if (_controller) { + if (immediately) { + if (_controller.enabled() && _enabled) { + var + scrollPos = _controller.info("scrollPos"), + newProgress; + + if (_options.duration > 0) { + newProgress = (scrollPos - _scrollOffset.start) / (_scrollOffset.end - _scrollOffset.start); + } else { + newProgress = scrollPos >= _scrollOffset.start ? 1 : 0; + } + + Scene.trigger("update", { + startPos: _scrollOffset.start, + endPos: _scrollOffset.end, + scrollPos: scrollPos + }); + + Scene.progress(newProgress); + } else if (_pin && _state === SCENE_STATE_DURING) { + updatePinState(true); // unpin in position + } + } else { + _controller.updateScene(Scene, false); + } + } + return Scene; + }; + + /** + * Updates dynamic scene variables like the trigger element position or the duration. + * This method is automatically called in regular intervals from the controller. See {@link ScrollMagic.Controller} option `refreshInterval`. + * + * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement. + * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient. + * + * @method ScrollMagic.Scene#refresh + * @since 1.1.0 + * @example + * scene = new ScrollMagic.Scene({triggerElement: "#trigger"}); + * + * // change the position of the trigger + * $("#trigger").css("top", 500); + * // immediately let the scene know of this change + * scene.refresh(); + * + * @fires {@link Scene.shift}, if the trigger element position or the duration changed + * @fires {@link Scene.change}, if the duration changed + * + * @returns {Scene} Parent object for chaining. + */ + this.refresh = function () { + updateDuration(); + updateTriggerElementPosition(); + // update trigger element position + return Scene; + }; + + /** + * **Get** or **Set** the scene's progress. + * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update(). + * The order in which the events are fired depends on the duration of the scene: + * 1. Scenes with `duration == 0`: + * Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired. + * When the trigger position of the scene is passed the events are always fired in this order: + * `enter`, `start`, `progress` when scrolling forward + * and + * `progress`, `start`, `leave` when scrolling in reverse + * 2. Scenes with `duration > 0`: + * Scenes with a set duration have a defined start and end point. + * When scrolling past the start position of the scene it will fire these events in this order: + * `enter`, `start`, `progress` + * When continuing to scroll and passing the end point it will fire these events: + * `progress`, `end`, `leave` + * When reversing through the end point these events are fired: + * `enter`, `end`, `progress` + * And when continuing to scroll past the start position in reverse it will fire: + * `progress`, `start`, `leave` + * In between start and end the `progress` event will be called constantly, whenever the progress changes. + * + * In short: + * `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update. + * `start` and `end` will always trigger at their respective position. + * + * Please review the event descriptions for details on the events and the event object that is passed to the callback. + * + * @method ScrollMagic.Scene#progress + * @example + * // get the current scene progress + * var progress = scene.progress(); + * + * // set new scene progress + * scene.progress(0.3); + * + * @fires {@link Scene.enter}, when used as setter + * @fires {@link Scene.start}, when used as setter + * @fires {@link Scene.progress}, when used as setter + * @fires {@link Scene.end}, when used as setter + * @fires {@link Scene.leave}, when used as setter + * + * @param {number} [progress] - The new progress value of the scene `[0-1]`. + * @returns {number} `get` - Current scene progress. + * @returns {Scene} `set` - Parent object for chaining. + */ + this.progress = function (progress) { + if (!arguments.length) { // get + return _progress; + } else { // set + var + doUpdate = false, + oldState = _state, + scrollDirection = _controller ? _controller.info("scrollDirection") : 'PAUSED', + reverseOrForward = _options.reverse || progress >= _progress; + if (_options.duration === 0) { + // zero duration scenes + doUpdate = _progress != progress; + _progress = progress < 1 && reverseOrForward ? 0 : 1; + _state = _progress === 0 ? SCENE_STATE_BEFORE : SCENE_STATE_DURING; + } else { + // scenes with start and end + if (progress < 0 && _state !== SCENE_STATE_BEFORE && reverseOrForward) { + // go back to initial state + _progress = 0; + _state = SCENE_STATE_BEFORE; + doUpdate = true; + } else if (progress >= 0 && progress < 1 && reverseOrForward) { + _progress = progress; + _state = SCENE_STATE_DURING; + doUpdate = true; + } else if (progress >= 1 && _state !== SCENE_STATE_AFTER) { + _progress = 1; + _state = SCENE_STATE_AFTER; + doUpdate = true; + } else if (_state === SCENE_STATE_DURING && !reverseOrForward) { + updatePinState(); // in case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well. + } + } + if (doUpdate) { + // fire events + var + eventVars = { + progress: _progress, + state: _state, + scrollDirection: scrollDirection + }, + stateChanged = _state != oldState; + + var trigger = function (eventName) { // tmp helper to simplify code + Scene.trigger(eventName, eventVars); + }; + + if (stateChanged) { // enter events + if (oldState !== SCENE_STATE_DURING) { + trigger("enter"); + trigger(oldState === SCENE_STATE_BEFORE ? "start" : "end"); + } + } + trigger("progress"); + if (stateChanged) { // leave events + if (_state !== SCENE_STATE_DURING) { + trigger(_state === SCENE_STATE_BEFORE ? "start" : "end"); + trigger("leave"); + } + } + } + + return Scene; + } + }; + + + /** + * Update the start and end scrollOffset of the container. + * The positions reflect what the controller's scroll position will be at the start and end respectively. + * Is called, when: + * - Scene event "change" is called with: offset, triggerHook, duration + * - scroll container event "resize" is called + * - the position of the triggerElement changes + * - the controller changes -> addTo() + * @private + */ + var updateScrollOffset = function () { + _scrollOffset = { + start: _triggerPos + _options.offset + }; + if (_controller && _options.triggerElement) { + // take away triggerHook portion to get relative to top + _scrollOffset.start -= _controller.info("size") * _options.triggerHook; + } + _scrollOffset.end = _scrollOffset.start + _options.duration; + }; + + /** + * Updates the duration if set to a dynamic function. + * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh(). + * + * @fires {@link Scene.change}, if the duration changed + * @fires {@link Scene.shift}, if the duration changed + * + * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed. + * @private + */ + var updateDuration = function (suppressEvents) { + // update duration + if (_durationUpdateMethod) { + var varname = "duration"; + if (changeOption(varname, _durationUpdateMethod.call(Scene)) && !suppressEvents) { // set + Scene.trigger("change", { + what: varname, + newval: _options[varname] + }); + Scene.trigger("shift", { + reason: varname + }); + } + } + }; + + /** + * Updates the position of the triggerElement, if present. + * This method is called ... + * - ... when the triggerElement is changed + * - ... when the scene is added to a (new) controller + * - ... in regular intervals from the controller through scene.refresh(). + * + * @fires {@link Scene.shift}, if the position changed + * + * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed. + * @private + */ + var updateTriggerElementPosition = function (suppressEvents) { + var + elementPos = 0, + telem = _options.triggerElement; + if (_controller && telem) { + var + controllerInfo = _controller.info(), + containerOffset = _util.get.offset(controllerInfo.container), + // container position is needed because element offset is returned in relation to document, not in relation to container. + param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ? + // if parent is spacer, use spacer position instead so correct start position is returned for pinned elements. + while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { + telem = telem.parentNode; + } + + var elementOffset = _util.get.offset(telem); + + if (!controllerInfo.isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent + containerOffset[param] -= _controller.scrollPos(); + } + + elementPos = elementOffset[param] - containerOffset[param]; + } + var changed = elementPos != _triggerPos; + _triggerPos = elementPos; + if (changed && !suppressEvents) { + Scene.trigger("shift", { + reason: "triggerElementPosition" + }); + } + }; + + /** + * Trigger a shift event, when the container is resized and the triggerHook is > 1. + * @private + */ + var onContainerResize = function (e) { + if (_options.triggerHook > 0) { + Scene.trigger("shift", { + reason: "containerResize" + }); + } + }; + + var _validate = _util.extend(SCENE_OPTIONS.validate, { + // validation for duration handled internally for reference to private var _durationMethod + duration: function (val) { + if (_util.type.String(val) && val.match(/^(\.|\d)*\d+%$/)) { + // percentage value + var perc = parseFloat(val) / 100; + val = function () { + return _controller ? _controller.info("size") * perc : 0; + }; + } + if (_util.type.Function(val)) { + // function + _durationUpdateMethod = val; + try { + val = parseFloat(_durationUpdateMethod()); + } catch (e) { + val = -1; // will cause error below + } + } + // val has to be float + val = parseFloat(val); + if (!_util.type.Number(val) || val < 0) { + if (_durationUpdateMethod) { + _durationUpdateMethod = undefined; + throw ["Invalid return value of supplied function for option \"duration\":", val]; + } else { + throw ["Invalid value for option \"duration\":", val]; + } + } + return val; + } + }); + + /** + * Checks the validity of a specific or all options and reset to default if neccessary. + * @private + */ + var validateOption = function (check) { + check = arguments.length ? [check] : Object.keys(_validate); + check.forEach(function (optionName, key) { + var value; + if (_validate[optionName]) { // there is a validation method for this option + try { // validate value + value = _validate[optionName](_options[optionName]); + } catch (e) { // validation failed -> reset to default + value = DEFAULT_OPTIONS[optionName]; + var logMSG = _util.type.String(e) ? [e] : e; + if (_util.type.Array(logMSG)) { + logMSG[0] = "ERROR: " + logMSG[0]; + logMSG.unshift(1); // loglevel 1 for error msg + log.apply(this, logMSG); + } else { + log(1, "ERROR: Problem executing validation callback for option '" + optionName + "':", e.message); + } + } finally { + _options[optionName] = value; + } + } + }); + }; + + /** + * Helper used by the setter/getters for scene options + * @private + */ + var changeOption = function (varname, newval) { + var + changed = false, + oldval = _options[varname]; + if (_options[varname] != newval) { + _options[varname] = newval; + validateOption(varname); // resets to default if necessary + changed = oldval != _options[varname]; + } + return changed; + }; + + // generate getters/setters for all options + var addSceneOption = function (optionName) { + if (!Scene[optionName]) { + Scene[optionName] = function (newVal) { + if (!arguments.length) { // get + return _options[optionName]; + } else { + if (optionName === "duration") { // new duration is set, so any previously set function must be unset + _durationUpdateMethod = undefined; + } + if (changeOption(optionName, newVal)) { // set + Scene.trigger("change", { + what: optionName, + newval: _options[optionName] + }); + if (SCENE_OPTIONS.shifts.indexOf(optionName) > -1) { + Scene.trigger("shift", { + reason: optionName + }); + } + } + } + return Scene; + }; + } + }; + + /** + * **Get** or **Set** the duration option value. + * As a setter it also accepts a function returning a numeric value. + * This is particularly useful for responsive setups. + * + * The duration is updated using the supplied function every time `Scene.refresh()` is called, which happens periodically from the controller (see ScrollMagic.Controller option `refreshInterval`). + * _**NOTE:** Be aware that it's an easy way to kill performance, if you supply a function that has high CPU demand. + * Even for size and position calculations it is recommended to use a variable to cache the value. (see example) + * This counts double if you use the same function for multiple scenes._ + * + * @method ScrollMagic.Scene#duration + * @example + * // get the current duration value + * var duration = scene.duration(); + * + * // set a new duration + * scene.duration(300); + * + * // use a function to automatically adjust the duration to the window height. + * var durationValueCache; + * function getDuration () { + * return durationValueCache; + * } + * function updateDuration (e) { + * durationValueCache = window.innerHeight; + * } + * $(window).on("resize", updateDuration); // update the duration when the window size changes + * $(window).triggerHandler("resize"); // set to initial value + * scene.duration(getDuration); // supply duration method + * + * @fires {@link Scene.change}, when used as setter + * @fires {@link Scene.shift}, when used as setter + * @param {(number|function)} [newDuration] - The new duration of the scene. + * @returns {number} `get` - Current scene duration. + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** or **Set** the offset option value. + * @method ScrollMagic.Scene#offset + * @example + * // get the current offset + * var offset = scene.offset(); + * + * // set a new offset + * scene.offset(100); + * + * @fires {@link Scene.change}, when used as setter + * @fires {@link Scene.shift}, when used as setter + * @param {number} [newOffset] - The new offset of the scene. + * @returns {number} `get` - Current scene offset. + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** or **Set** the triggerElement option value. + * Does **not** fire `Scene.shift`, because changing the trigger Element doesn't necessarily mean the start position changes. This will be determined in `Scene.refresh()`, which is automatically triggered. + * @method ScrollMagic.Scene#triggerElement + * @example + * // get the current triggerElement + * var triggerElement = scene.triggerElement(); + * + * // set a new triggerElement using a selector + * scene.triggerElement("#trigger"); + * // set a new triggerElement using a DOM object + * scene.triggerElement(document.getElementById("trigger")); + * + * @fires {@link Scene.change}, when used as setter + * @param {(string|object)} [newTriggerElement] - The new trigger element for the scene. + * @returns {(string|object)} `get` - Current triggerElement. + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** or **Set** the triggerHook option value. + * @method ScrollMagic.Scene#triggerHook + * @example + * // get the current triggerHook value + * var triggerHook = scene.triggerHook(); + * + * // set a new triggerHook using a string + * scene.triggerHook("onLeave"); + * // set a new triggerHook using a number + * scene.triggerHook(0.7); + * + * @fires {@link Scene.change}, when used as setter + * @fires {@link Scene.shift}, when used as setter + * @param {(number|string)} [newTriggerHook] - The new triggerHook of the scene. See {@link Scene} parameter description for value options. + * @returns {number} `get` - Current triggerHook (ALWAYS numerical). + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** or **Set** the reverse option value. + * @method ScrollMagic.Scene#reverse + * @example + * // get the current reverse option + * var reverse = scene.reverse(); + * + * // set new reverse option + * scene.reverse(false); + * + * @fires {@link Scene.change}, when used as setter + * @param {boolean} [newReverse] - The new reverse setting of the scene. + * @returns {boolean} `get` - Current reverse option value. + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** or **Set** the loglevel option value. + * @method ScrollMagic.Scene#loglevel + * @example + * // get the current loglevel + * var loglevel = scene.loglevel(); + * + * // set new loglevel + * scene.loglevel(3); + * + * @fires {@link Scene.change}, when used as setter + * @param {number} [newLoglevel] - The new loglevel setting of the scene. `[0-3]` + * @returns {number} `get` - Current loglevel. + * @returns {Scene} `set` - Parent object for chaining. + */ + + /** + * **Get** the associated controller. + * @method ScrollMagic.Scene#controller + * @example + * // get the controller of a scene + * var controller = scene.controller(); + * + * @returns {ScrollMagic.Controller} Parent controller or `undefined` + */ + this.controller = function () { + return _controller; + }; + + /** + * **Get** the current state. + * @method ScrollMagic.Scene#state + * @example + * // get the current state + * var state = scene.state(); + * + * @returns {string} `"BEFORE"`, `"DURING"` or `"AFTER"` + */ + this.state = function () { + return _state; + }; + + /** + * **Get** the current scroll offset for the start of the scene. + * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `"onLeave"`). + * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset. + * @method ScrollMagic.Scene#scrollOffset + * @example + * // get the current scroll offset for the start and end of the scene. + * var start = scene.scrollOffset(); + * var end = scene.scrollOffset() + scene.duration(); + * console.log("the scene starts at", start, "and ends at", end); + * + * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls. + */ + this.scrollOffset = function () { + return _scrollOffset.start; + }; + + /** + * **Get** the trigger position of the scene (including the value of the `offset` option). + * @method ScrollMagic.Scene#triggerPosition + * @example + * // get the scene's trigger position + * var triggerPosition = scene.triggerPosition(); + * + * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls. + */ + this.triggerPosition = function () { + var pos = _options.offset; // the offset is the basis + if (_controller) { + // get the trigger position + if (_options.triggerElement) { + // Element as trigger + pos += _triggerPos; + } else { + // return the height of the triggerHook to start at the beginning + pos += _controller.info("size") * Scene.triggerHook(); + } + } + return pos; + }; + + var + _pin, _pinOptions; + + Scene.on("shift.internal", function (e) { + var durationChanged = e.reason === "duration"; + if ((_state === SCENE_STATE_AFTER && durationChanged) || (_state === SCENE_STATE_DURING && _options.duration === 0)) { + // if [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed]. + updatePinState(); + } + if (durationChanged) { + updatePinDimensions(); + } + }).on("progress.internal", function (e) { + updatePinState(); + }).on("add.internal", function (e) { + updatePinDimensions(); + }).on("destroy.internal", function (e) { + Scene.removePin(e.reset); + }); + /** + * Update the pin state. + * @private + */ + var updatePinState = function (forceUnpin) { + if (_pin && _controller) { + var + containerInfo = _controller.info(), + pinTarget = _pinOptions.spacer.firstChild; // may be pin element or another spacer, if cascading pins + if (!forceUnpin && _state === SCENE_STATE_DURING) { // during scene or if duration is 0 and we are past the trigger + // pinned state + if (_util.css(pinTarget, "position") != "fixed") { + // change state before updating pin spacer (position changes due to fixed collapsing might occur.) + _util.css(pinTarget, { + "position": "fixed" + }); + // update pin spacer + updatePinDimensions(); + } + + var + fixedPos = _util.get.offset(_pinOptions.spacer, true), + // get viewport position of spacer + scrollDistance = _options.reverse || _options.duration === 0 ? containerInfo.scrollPos - _scrollOffset.start // quicker + : Math.round(_progress * _options.duration * 10) / 10; // if no reverse and during pin the position needs to be recalculated using the progress + // add scrollDistance + fixedPos[containerInfo.vertical ? "top" : "left"] += scrollDistance; + + // set new values + _util.css(_pinOptions.spacer.firstChild, { + top: fixedPos.top, + left: fixedPos.left + }); + } else { + // unpinned state + var + newCSS = { + position: _pinOptions.inFlow ? "relative" : "absolute", + top: 0, + left: 0 + }, + change = _util.css(pinTarget, "position") != newCSS.position; + + if (!_pinOptions.pushFollowers) { + newCSS[containerInfo.vertical ? "top" : "left"] = _options.duration * _progress; + } else if (_options.duration > 0) { // only concerns scenes with duration + if (_state === SCENE_STATE_AFTER && parseFloat(_util.css(_pinOptions.spacer, "padding-top")) === 0) { + change = true; // if in after state but havent updated spacer yet (jumped past pin) + } else if (_state === SCENE_STATE_BEFORE && parseFloat(_util.css(_pinOptions.spacer, "padding-bottom")) === 0) { // before + change = true; // jumped past fixed state upward direction + } + } + // set new values + _util.css(pinTarget, newCSS); + if (change) { + // update pin spacer if state changed + updatePinDimensions(); + } + } + } + }; + + /** + * Update the pin spacer and/or element size. + * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements. + * @private + */ + var updatePinDimensions = function () { + if (_pin && _controller && _pinOptions.inFlow) { // no spacerresize, if original position is absolute + var + after = (_state === SCENE_STATE_AFTER), + before = (_state === SCENE_STATE_BEFORE), + during = (_state === SCENE_STATE_DURING), + vertical = _controller.info("vertical"), + pinTarget = _pinOptions.spacer.firstChild, + // usually the pined element but can also be another spacer (cascaded pins) + marginCollapse = _util.isMarginCollapseType(_util.css(_pinOptions.spacer, "display")), + css = {}; + + // set new size + // if relsize: spacer -> pin | else: pin -> spacer + if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) { + if (during) { + _util.css(_pin, { + "width": _util.get.width(_pinOptions.spacer) + }); + } else { + _util.css(_pin, { + "width": "100%" + }); + } + } else { + // minwidth is needed for cascaded pins. + css["min-width"] = _util.get.width(vertical ? _pin : pinTarget, true, true); + css.width = during ? css["min-width"] : "auto"; + } + if (_pinOptions.relSize.height) { + if (during) { + // the only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that. + _util.css(_pin, { + "height": _util.get.height(_pinOptions.spacer) - (_pinOptions.pushFollowers ? _options.duration : 0) + }); + } else { + _util.css(_pin, { + "height": "100%" + }); + } + } else { + // margin is only included if it's a cascaded pin to resolve an IE9 bug + css["min-height"] = _util.get.height(vertical ? pinTarget : _pin, true, !marginCollapse); // needed for cascading pins + css.height = during ? css["min-height"] : "auto"; + } + + // add space for duration if pushFollowers is true + if (_pinOptions.pushFollowers) { + css["padding" + (vertical ? "Top" : "Left")] = _options.duration * _progress; + css["padding" + (vertical ? "Bottom" : "Right")] = _options.duration * (1 - _progress); + } + _util.css(_pinOptions.spacer, css); + } + }; + + /** + * Updates the Pin state (in certain scenarios) + * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions. + * So this function is called on resize and scroll of the document. + * @private + */ + var updatePinInContainer = function () { + if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) { + updatePinState(); + } + }; + + /** + * Updates the Pin spacer size state (in certain scenarios) + * If container is resized during pin and relatively sized the size of the pin might need to be updated... + * So this function is called on resize of the container. + * @private + */ + var updateRelativePinSpacer = function () { + if (_controller && _pin && // well, duh + _state === SCENE_STATE_DURING && // element in pinned state? + ( // is width or height relatively sized, but not in relation to body? then we need to recalc. + ((_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) && _util.get.width(window) != _util.get.width(_pinOptions.spacer.parentNode)) || (_pinOptions.relSize.height && _util.get.height(window) != _util.get.height(_pinOptions.spacer.parentNode)))) { + updatePinDimensions(); + } + }; + + /** + * Is called, when the mousewhel is used while over a pinned element inside a div container. + * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container. + * @private + */ + var onMousewheelOverPin = function (e) { + if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) { // in pin state + e.preventDefault(); + _controller._setScrollPos(_controller.info("scrollPos") - ((e.wheelDelta || e[_controller.info("vertical") ? "wheelDeltaY" : "wheelDeltaX"]) / 3 || -e.detail * 30)); + } + }; + + /** + * Pin an element for the duration of the tween. + * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position. + * Make sure only one pin is applied to an element at the same time. + * An element can be pinned multiple times, but only successively. + * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._ + * @method ScrollMagic.Scene#setPin + * @example + * // pin element and push all following elements down by the amount of the pin duration. + * scene.setPin("#pin"); + * + * // pin element and keeping all following elements in their place. The pinned element will move past them. + * scene.setPin("#pin", {pushFollowers: false}); + * + * @param {(string|object)} element - A Selector targeting an element or a DOM object that is supposed to be pinned. + * @param {object} [settings] - settings for the pin + * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be "pushed" down for the duration of the pin, if `false` the pinned element will just scroll past them. + Ignored, when duration is `0`. + * @param {string} [settings.spacerClass="scrollmagic-pin-spacer"] - Classname of the pin spacer element, which is used to replace the element. + * + * @returns {Scene} Parent object for chaining. + */ + this.setPin = function (element, settings) { + var + defaultSettings = { + pushFollowers: true, + spacerClass: "scrollmagic-pin-spacer" + }; + settings = _util.extend({}, defaultSettings, settings); + + // validate Element + element = _util.get.elements(element)[0]; + if (!element) { + log(1, "ERROR calling method 'setPin()': Invalid pin element supplied."); + return Scene; // cancel + } else if (_util.css(element, "position") === "fixed") { + log(1, "ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'."); + return Scene; // cancel + } + + if (_pin) { // preexisting pin? + if (_pin === element) { + // same pin we already have -> do nothing + return Scene; // cancel + } else { + // kill old pin + Scene.removePin(); + } + + } + _pin = element; + + var + parentDisplay = _pin.parentNode.style.display, + boundsParams = ["top", "left", "bottom", "right", "margin", "marginLeft", "marginRight", "marginTop", "marginBottom"]; + + _pin.parentNode.style.display = 'none'; // hack start to force css to return stylesheet values instead of calculated px values. + var + inFlow = _util.css(_pin, "position") != "absolute", + pinCSS = _util.css(_pin, boundsParams.concat(["display"])), + sizeCSS = _util.css(_pin, ["width", "height"]); + _pin.parentNode.style.display = parentDisplay; // hack end. + if (!inFlow && settings.pushFollowers) { + log(2, "WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled."); + settings.pushFollowers = false; + } + window.setTimeout(function () { // wait until all finished, because with responsive duration it will only be set after scene is added to controller + if (_pin && _options.duration === 0 && settings.pushFollowers) { + log(2, "WARNING: pushFollowers =", true, "has no effect, when scene duration is 0."); + } + }, 0); + + // create spacer and insert + var + spacer = _pin.parentNode.insertBefore(document.createElement('div'), _pin), + spacerCSS = _util.extend(pinCSS, { + position: inFlow ? "relative" : "absolute", + boxSizing: "content-box", + mozBoxSizing: "content-box", + webkitBoxSizing: "content-box" + }); + + if (!inFlow) { // copy size if positioned absolutely, to work for bottom/right positioned elements. + _util.extend(spacerCSS, _util.css(_pin, ["width", "height"])); + } + + _util.css(spacer, spacerCSS); + spacer.setAttribute(PIN_SPACER_ATTRIBUTE, ""); + _util.addClass(spacer, settings.spacerClass); + + // set the pin Options + _pinOptions = { + spacer: spacer, + relSize: { // save if size is defined using % values. if so, handle spacer resize differently... + width: sizeCSS.width.slice(-1) === "%", + height: sizeCSS.height.slice(-1) === "%", + autoFullWidth: sizeCSS.width === "auto" && inFlow && _util.isMarginCollapseType(pinCSS.display) + }, + pushFollowers: settings.pushFollowers, + inFlow: inFlow, + // stores if the element takes up space in the document flow + }; + + if (!_pin.___origStyle) { + _pin.___origStyle = {}; + var + pinInlineCSS = _pin.style, + copyStyles = boundsParams.concat(["width", "height", "position", "boxSizing", "mozBoxSizing", "webkitBoxSizing"]); + copyStyles.forEach(function (val) { + _pin.___origStyle[val] = pinInlineCSS[val] || ""; + }); + } + + // if relative size, transfer it to spacer and make pin calculate it... + if (_pinOptions.relSize.width) { + _util.css(spacer, { + width: sizeCSS.width + }); + } + if (_pinOptions.relSize.height) { + _util.css(spacer, { + height: sizeCSS.height + }); + } + + // now place the pin element inside the spacer + spacer.appendChild(_pin); + // and set new css + _util.css(_pin, { + position: inFlow ? "relative" : "absolute", + margin: "auto", + top: "auto", + left: "auto", + bottom: "auto", + right: "auto" + }); + + if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) { + _util.css(_pin, { + boxSizing: "border-box", + mozBoxSizing: "border-box", + webkitBoxSizing: "border-box" + }); + } + + // add listener to document to update pin position in case controller is not the document. + window.addEventListener('scroll', updatePinInContainer); + window.addEventListener('resize', updatePinInContainer); + window.addEventListener('resize', updateRelativePinSpacer); + // add mousewheel listener to catch scrolls over fixed elements + _pin.addEventListener("mousewheel", onMousewheelOverPin); + _pin.addEventListener("DOMMouseScroll", onMousewheelOverPin); + + log(3, "added pin"); + + // finally update the pin to init + updatePinState(); + + return Scene; + }; + + /** + * Remove the pin from the scene. + * @method ScrollMagic.Scene#removePin + * @example + * // remove the pin from the scene without resetting it (the spacer is not removed) + * scene.removePin(); + * + * // remove the pin from the scene and reset the pin element to its initial position (spacer is removed) + * scene.removePin(true); + * + * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset. + * @returns {Scene} Parent object for chaining. + */ + this.removePin = function (reset) { + if (_pin) { + if (_state === SCENE_STATE_DURING) { + updatePinState(true); // force unpin at position + } + if (reset || !_controller) { // if there's no controller no progress was made anyway... + var pinTarget = _pinOptions.spacer.firstChild; // usually the pin element, but may be another spacer (cascaded pins)... + if (pinTarget.hasAttribute(PIN_SPACER_ATTRIBUTE)) { // copy margins to child spacer + var + style = _pinOptions.spacer.style, + values = ["margin", "marginLeft", "marginRight", "marginTop", "marginBottom"]; + margins = {}; + values.forEach(function (val) { + margins[val] = style[val] || ""; + }); + _util.css(pinTarget, margins); + } + _pinOptions.spacer.parentNode.insertBefore(pinTarget, _pinOptions.spacer); + _pinOptions.spacer.parentNode.removeChild(_pinOptions.spacer); + if (!_pin.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) { // if it's the last pin for this element -> restore inline styles + // TODO: only correctly set for first pin (when cascading) - how to fix? + _util.css(_pin, _pin.___origStyle); + delete _pin.___origStyle; + } + } + window.removeEventListener('scroll', updatePinInContainer); + window.removeEventListener('resize', updatePinInContainer); + window.removeEventListener('resize', updateRelativePinSpacer); + _pin.removeEventListener("mousewheel", onMousewheelOverPin); + _pin.removeEventListener("DOMMouseScroll", onMousewheelOverPin); + _pin = undefined; + log(3, "removed pin (reset: " + (reset ? "true" : "false") + ")"); + } + return Scene; + }; + + + var + _cssClasses, _cssClassElems = []; + + Scene.on("destroy.internal", function (e) { + Scene.removeClassToggle(e.reset); + }); + /** + * Define a css class modification while the scene is active. + * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over. + * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position. + * @method ScrollMagic.Scene#setClassToggle + * @example + * // add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene + * scene.setClassToggle("#my-elem", "myclass"); + * + * // add multiple classes to multiple elements defined by the selector '.classChange' + * scene.setClassToggle(".classChange", "class1 class2 class3"); + * + * @param {(string|object)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified. + * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene. + * + * @returns {Scene} Parent object for chaining. + */ + this.setClassToggle = function (element, classes) { + var elems = _util.get.elements(element); + if (elems.length === 0 || !_util.type.String(classes)) { + log(1, "ERROR calling method 'setClassToggle()': Invalid " + (elems.length === 0 ? "element" : "classes") + " supplied."); + return Scene; + } + if (_cssClassElems.length > 0) { + // remove old ones + Scene.removeClassToggle(); + } + _cssClasses = classes; + _cssClassElems = elems; + Scene.on("enter.internal_class leave.internal_class", function (e) { + var toggle = e.type === "enter" ? _util.addClass : _util.removeClass; + _cssClassElems.forEach(function (elem, key) { + toggle(elem, _cssClasses); + }); + }); + return Scene; + }; + + /** + * Remove the class binding from the scene. + * @method ScrollMagic.Scene#removeClassToggle + * @example + * // remove class binding from the scene without reset + * scene.removeClassToggle(); + * + * // remove class binding and remove the changes it caused + * scene.removeClassToggle(true); + * + * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed. + * @returns {Scene} Parent object for chaining. + */ + this.removeClassToggle = function (reset) { + if (reset) { + _cssClassElems.forEach(function (elem, key) { + _util.removeClass(elem, _cssClasses); + }); + } + Scene.off("start.internal_class end.internal_class"); + _cssClasses = undefined; + _cssClassElems = []; + return Scene; + }; + + // INIT + construct(); + return Scene; + }; + + // store pagewide scene options + var SCENE_OPTIONS = { + defaults: { + duration: 0, + offset: 0, + triggerElement: undefined, + triggerHook: 0.5, + reverse: true, + loglevel: 2 + }, + validate: { + offset: function (val) { + val = parseFloat(val); + if (!_util.type.Number(val)) { + throw ["Invalid value for option \"offset\":", val]; + } + return val; + }, + triggerElement: function (val) { + val = val || undefined; + if (val) { + var elem = _util.get.elements(val)[0]; + if (elem) { + val = elem; + } else { + throw ["Element defined in option \"triggerElement\" was not found:", val]; + } + } + return val; + }, + triggerHook: function (val) { + var translate = { + "onCenter": 0.5, + "onEnter": 1, + "onLeave": 0 + }; + if (_util.type.Number(val)) { + val = Math.max(0, Math.min(parseFloat(val), 1)); // make sure its betweeen 0 and 1 + } else if (val in translate) { + val = translate[val]; + } else { + throw ["Invalid value for option \"triggerHook\": ", val]; + } + return val; + }, + reverse: function (val) { + return !!val; // force boolean + }, + loglevel: function (val) { + val = parseInt(val); + if (!_util.type.Number(val) || val < 0 || val > 3) { + throw ["Invalid value for option \"loglevel\":", val]; + } + return val; + } + }, + // holder for validation methods. duration validation is handled in 'getters-setters.js' + shifts: ["duration", "offset", "triggerHook"], + // list of options that trigger a `shift` event + }; +/* + * method used to add an option to ScrollMagic Scenes. + * TODO: DOC (private for dev) + */ + ScrollMagic.Scene.addOption = function (name, defaultValue, validationCallback, shifts) { + if (!(name in SCENE_OPTIONS.defaults)) { + SCENE_OPTIONS.defaults[name] = defaultValue; + SCENE_OPTIONS.validate[name] = validationCallback; + if (shifts) { + SCENE_OPTIONS.shifts.push(name); + } + } else { + ScrollMagic._util.log(1, "[static] ScrollMagic.Scene -> Cannot add Scene option '" + name + "', because it already exists."); + } + }; + // instance extension function for plugins + // TODO: DOC (private for dev) + ScrollMagic.Scene.extend = function (extension) { + var oldClass = this; + ScrollMagic.Scene = function () { + oldClass.apply(this, arguments); + this.$super = _util.extend({}, this); // copy parent state + return extension.apply(this, arguments) || this; + }; + _util.extend(ScrollMagic.Scene, oldClass); // copy properties + ScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype + ScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor + }; + + + /** + * TODO: DOCS (private for dev) + * @class + * @private + */ + + ScrollMagic.Event = function (type, namespace, target, vars) { + vars = vars || {}; + for (var key in vars) { + this[key] = vars[key]; + } + this.type = type; + this.target = this.currentTarget = target; + this.namespace = namespace || ''; + this.timeStamp = this.timestamp = Date.now(); + return this; + }; + +/* + * TODO: DOCS (private for dev) + */ + + var _util = ScrollMagic._util = (function (window) { + var U = {}, + i; + + /** + * ------------------------------ + * internal helpers + * ------------------------------ + */ + + // parse float and fall back to 0. + var floatval = function (number) { + return parseFloat(number) || 0; + }; + // get current style IE safe (otherwise IE would return calculated values for 'auto') + var _getComputedStyle = function (elem) { + return elem.currentStyle ? elem.currentStyle : window.getComputedStyle(elem); + }; + + // get element dimension (width or height) + var _dimension = function (which, elem, outer, includeMargin) { + elem = (elem === document) ? window : elem; + if (elem === window) { + includeMargin = false; + } else if (!_type.DomElement(elem)) { + return 0; + } + which = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase(); + var dimension = (outer ? elem['offset' + which] || elem['outer' + which] : elem['client' + which] || elem['inner' + which]) || 0; + if (outer && includeMargin) { + var style = _getComputedStyle(elem); + dimension += which === 'Height' ? floatval(style.marginTop) + floatval(style.marginBottom) : floatval(style.marginLeft) + floatval(style.marginRight); + } + return dimension; + }; + // converts 'margin-top' into 'marginTop' + var _camelCase = function (str) { + return str.replace(/^[^a-z]+([a-z])/g, '$1').replace(/-([a-z])/g, function (g) { + return g[1].toUpperCase(); + }); + }; + + /** + * ------------------------------ + * external helpers + * ------------------------------ + */ + + // extend obj – same as jQuery.extend({}, objA, objB) + U.extend = function (obj) { + obj = obj || {}; + for (i = 1; i < arguments.length; i++) { + if (!arguments[i]) { + continue; + } + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) { + obj[key] = arguments[i][key]; + } + } + } + return obj; + }; + + // check if a css display type results in margin-collapse or not + U.isMarginCollapseType = function (str) { + return ["block", "flex", "list-item", "table", "-webkit-box"].indexOf(str) > -1; + }; + + // implementation of requestAnimationFrame + // based on https://gist.github.com/paulirish/1579671 + var + lastTime = 0, + vendors = ['ms', 'moz', 'webkit', 'o']; + var _requestAnimationFrame = window.requestAnimationFrame; + var _cancelAnimationFrame = window.cancelAnimationFrame; + // try vendor prefixes if the above doesn't work + for (i = 0; !_requestAnimationFrame && i < vendors.length; ++i) { + _requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame']; + _cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame']; + } + + // fallbacks + if (!_requestAnimationFrame) { + _requestAnimationFrame = function (callback) { + var + currTime = new Date().getTime(), + timeToCall = Math.max(0, 16 - (currTime - lastTime)), + id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + if (!_cancelAnimationFrame) { + _cancelAnimationFrame = function (id) { + window.clearTimeout(id); + }; + } + U.rAF = _requestAnimationFrame.bind(window); + U.cAF = _cancelAnimationFrame.bind(window); + + var + loglevels = ["error", "warn", "log"], + console = window.console || {}; + + console.log = console.log || + function () {}; // no console log, well - do nothing then... + // make sure methods for all levels exist. + for (i = 0; i < loglevels.length; i++) { + var method = loglevels[i]; + if (!console[method]) { + console[method] = console.log; // prefer .log over nothing + } + } + U.log = function (loglevel) { + if (loglevel > loglevels.length || loglevel <= 0) loglevel = loglevels.length; + var now = new Date(), + time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2) + ":" + ("0" + now.getSeconds()).slice(-2) + ":" + ("00" + now.getMilliseconds()).slice(-3), + method = loglevels[loglevel - 1], + args = Array.prototype.splice.call(arguments, 1), + func = Function.prototype.bind.call(console[method], console); + args.unshift(time); + func.apply(console, args); + }; + + /** + * ------------------------------ + * type testing + * ------------------------------ + */ + + var _type = U.type = function (v) { + return Object.prototype.toString.call(v).replace(/^\[object (.+)\]$/, "$1").toLowerCase(); + }; + _type.String = function (v) { + return _type(v) === 'string'; + }; + _type.Function = function (v) { + return _type(v) === 'function'; + }; + _type.Array = function (v) { + return Array.isArray(v); + }; + _type.Number = function (v) { + return !_type.Array(v) && (v - parseFloat(v) + 1) >= 0; + }; + _type.DomElement = function (o) { + return ( + typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 + o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"); + }; + + /** + * ------------------------------ + * DOM Element info + * ------------------------------ + */ + // always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors + var _get = U.get = {}; + _get.elements = function (selector) { + var arr = []; + if (_type.String(selector)) { + try { + selector = document.querySelectorAll(selector); + } catch (e) { // invalid selector + return arr; + } + } + if (_type(selector) === 'nodelist' || _type.Array(selector)) { + for (var i = 0, ref = arr.length = selector.length; i < ref; i++) { // list of elements + var elem = selector[i]; + arr[i] = _type.DomElement(elem) ? elem : _get.elements(elem); // if not an element, try to resolve recursively + } + } else if (_type.DomElement(selector) || selector === document || selector === window) { + arr = [selector]; // only the element + } + return arr; + }; + // get scroll top value + _get.scrollTop = function (elem) { + return (elem && typeof elem.scrollTop === 'number') ? elem.scrollTop : window.pageYOffset || 0; + }; + // get scroll left value + _get.scrollLeft = function (elem) { + return (elem && typeof elem.scrollLeft === 'number') ? elem.scrollLeft : window.pageXOffset || 0; + }; + // get element height + _get.width = function (elem, outer, includeMargin) { + return _dimension('width', elem, outer, includeMargin); + }; + // get element width + _get.height = function (elem, outer, includeMargin) { + return _dimension('height', elem, outer, includeMargin); + }; + + // get element position (optionally relative to viewport) + _get.offset = function (elem, relativeToViewport) { + var offset = { + top: 0, + left: 0 + }; + if (elem && elem.getBoundingClientRect) { // check if available + var rect = elem.getBoundingClientRect(); + offset.top = rect.top; + offset.left = rect.left; + if (!relativeToViewport) { // clientRect is by default relative to viewport... + offset.top += _get.scrollTop(); + offset.left += _get.scrollLeft(); + } + } + return offset; + }; + + /** + * ------------------------------ + * DOM Element manipulation + * ------------------------------ + */ + + U.addClass = function (elem, classname) { + if (classname) { + if (elem.classList) elem.classList.add(classname); + else elem.className += ' ' + classname; + } + }; + U.removeClass = function (elem, classname) { + if (classname) { + if (elem.classList) elem.classList.remove(classname); + else elem.className = elem.className.replace(new RegExp('(^|\\b)' + classname.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + } + }; + // if options is string -> returns css value + // if options is array -> returns object with css value pairs + // if options is object -> set new css values + U.css = function (elem, options) { + if (_type.String(options)) { + return _getComputedStyle(elem)[_camelCase(options)]; + } else if (_type.Array(options)) { + var + obj = {}, + style = _getComputedStyle(elem); + options.forEach(function (option, key) { + obj[option] = style[_camelCase(option)]; + }); + return obj; + } else { + for (var option in options) { + var val = options[option]; + if (val == parseFloat(val)) { // assume pixel for seemingly numerical values + val += 'px'; + } + elem.style[_camelCase(option)] = val; + } + } + }; + + return U; + }(window || {})); + + ScrollMagic.Scene.prototype.addIndicators = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling addIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js'); + return this; + } + ScrollMagic.Scene.prototype.removeIndicators = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js'); + return this; + } + ScrollMagic.Scene.prototype.setTween = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js'); + return this; + } + ScrollMagic.Scene.prototype.removeTween = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js'); + return this; + } + ScrollMagic.Scene.prototype.setVelocity = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js'); + return this; + } + ScrollMagic.Scene.prototype.removeVelocity = function () { + ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js'); + return this; + } + + return ScrollMagic; +})); \ No newline at end of file diff --git a/js/scrolltrigger.js b/js/scrolltrigger.js new file mode 100644 index 00000000..5919d283 --- /dev/null +++ b/js/scrolltrigger.js @@ -0,0 +1,32 @@ +// addEventListener support for IE8 +function bindEvent(element, eventName, eventHandler) { + if (element.addEventListener){ + element.addEventListener(eventName, eventHandler, false); + } else if (element.attachEvent) { + element.attachEvent('on' + eventName, eventHandler); + } +} +// Send a message to the child iframe +var iframeEl = document.getElementById('arena') +var sendMessage = function(msg) { + // Make sure you are sending a string, and to stringify JSON + iframeEl.contentWindow.postMessage(msg, '*'); +}; + + +// console.log("ScrollMagic v%s loaded", ScrollMagic.version); +// init +var ctrl = new ScrollMagic.Controller(); +function maketrigger(divname,f,htmlname) { + // create scene + var scene = new ScrollMagic.Scene({ + triggerElement: divname + }) + .on('start', function() {return f(htmlname)}) + .addTo(ctrl); +} +maketrigger("#b4toptrigger",sendMessage,'ballot4.html') +maketrigger("#b4bottomtrigger",sendMessage,'ballot4.html') +maketrigger("#b5toptrigger",sendMessage,'ballot5.html') +maketrigger("#b5bottomtrigger",sendMessage,'ballot5.html') +// Open console to see output! \ No newline at end of file diff --git a/newer.html b/newer.html index d286c840..6ce3f9a4 100644 --- a/newer.html +++ b/newer.html @@ -36,6 +36,12 @@ +
+ +
+ + + From 6f55d86afcd73ad7931b4bd2436f227cfc8b24e0 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 13 Aug 2017 13:01:49 -0400 Subject: [PATCH 093/120] fixed side bar works but needs sizing css. --- js/scrolltrigger.js | 27 +++++++++++++++++++---- newer.html | 40 +++++++++++++++++++++++++++++------ play/css/fixedbox.css | 47 +++++++++++++++++++++++++++++++++++++++++ play/js/Ballot.js | 2 +- play/js/Presets.js | 9 ++++++++ play/js/main_sandbox.js | 2 +- sandbox/fixedbox.html | 38 +++++++++++++++++++++++++++++++++ sandbox/sandbox.html | 2 +- 8 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 play/css/fixedbox.css create mode 100644 sandbox/fixedbox.html diff --git a/js/scrolltrigger.js b/js/scrolltrigger.js index 5919d283..444631d4 100644 --- a/js/scrolltrigger.js +++ b/js/scrolltrigger.js @@ -25,8 +25,27 @@ function maketrigger(divname,f,htmlname) { .on('start', function() {return f(htmlname)}) .addTo(ctrl); } -maketrigger("#b4toptrigger",sendMessage,'ballot4.html') -maketrigger("#b4bottomtrigger",sendMessage,'ballot4.html') -maketrigger("#b5toptrigger",sendMessage,'ballot5.html') -maketrigger("#b5bottomtrigger",sendMessage,'ballot5.html') +// maketrigger("#ballot4.html-toptrigger",sendMessage,'ballot4.html') +// maketrigger("#b4bottomtrigger",sendMessage,'ballot4.html') +// maketrigger("#b5toptrigger",sendMessage,'ballot5.html') +// maketrigger("#b5bottomtrigger",sendMessage,'ballot5.html') +//ballot4t + +// get all class triggers +var triggers = document.getElementsByClassName("spacer") +for (var i in triggers) { + // var divname = triggers[i].id + // var htmlname = divname.split("")[0] + var id1 = triggers[i].id + if (id1) { + + var divname = id1 + //var htmlname = id1.substring(0, id1.length - 1) + ".html" + + var htmlname = id1.slice(0, -1) + ".html" + maketrigger("#"+divname,sendMessage,htmlname) + } +} + + // Open console to see output! \ No newline at end of file diff --git a/newer.html b/newer.html index 6ce3f9a4..4e135eb9 100644 --- a/newer.html +++ b/newer.html @@ -36,8 +36,7 @@ -
- @@ -152,6 +151,7 @@

Unstrategic voting

+

UNSTRATEGIC BALLOT

@@ -185,8 +185,6 @@

Digression: median systems

I used to think that median voting methods were the best. But then I did the simulations I'll talk about below, and they were merely OK; not much better outcomes than approval voting, but without the simplicity. I still think they're hugely better than FPTP and a bit better than IRV, but I'm not sold enough on them for it to be worth my time programming them in to Nicky's simulator.

-
-

Lightly-strategic voting: "normalization"

@@ -195,6 +193,9 @@

Lightly-strategic voting: "normalization"

Here's an example of a "normalizing" voter for you to play with:

+ +
+

Normalizing Voter

@@ -203,10 +204,12 @@

Normalizing Voter

+ +
+

Description: this should be like ncase's "drag the voter" examples, with a normalizing score voter. This voter should have a series of circles, where the closest one intersects the closest candidate and the farthest one the farthest candidate. Thus, as you moved the voter or candidates the circles would change size.

-

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try moving the losing yellow traingle candidate, and see what happens.

@@ -224,6 +227,8 @@

Normalizing Voter

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

+
+

@@ -239,6 +244,8 @@

Normalizing Voter

+
+

Strong Strategic Voter

@@ -256,6 +263,8 @@

Strong Strategic Voter Even stronger strategic voters could only choose the best of the frontrunners.

+
+

Best Frontrunner

@@ -269,6 +278,9 @@

Best Frontrunner

A more risk-averse, safe strategic voter could avoid the worst frontrunner by voting for everyone better.

+ +
+

Not the Worst Frontrunner

@@ -290,6 +302,8 @@

Not the Worst Frontrunne

+
+

@@ -308,6 +322,8 @@

Not the Worst Frontrunne

+
+

@@ -316,6 +332,8 @@

Not the Worst Frontrunne

+
+

@@ -335,6 +353,8 @@

Star voting

"Star", or more precisely, "s+ar", stands for "score plus automatic runoff." In this method, voters use the same ballot as score voting. Between the two candidates with the highest scores, the winner is the one that comes higher on more ballots. Here's a one-voter star election. You can choose between three kinds of strategy: normalized, moderately strategic, and strongly strategic. The first and last kinds you've seen before. The third is almost like a strongly strategic voter, except that the ratings may be changed by one to avoid giving a frontrunner the same score as any other candidate. Here's a one-voter election:

+
+

Star Strong

@@ -350,6 +370,8 @@

Star Strong

And here's the chicken dilemma you saw above:

+
+

@@ -367,6 +389,8 @@

3-2-1 voting

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

+
+

321 Strategic

@@ -382,6 +406,8 @@

321 Strategic

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

+
+

@@ -398,6 +424,8 @@

321 Strategic

+
+
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- -- - - - - - - - - --> - -
+

You read/played Nicky Case's great explainer on voting methods. And you still want more!

@@ -87,14 +84,13 @@

Unstrategic voting

-
+

UNSTRATEGIC BALLOT

Judge, don't choose.

- - +

Description: this should just be an unstrategic score voter, as in ncase's thing. Allow ballot picture to show 0 scores.

@@ -130,48 +126,49 @@

Lightly-strategic voting: "normalization"

-
-
+
+

Normalizing Voter

Best is 5. Worst is 1.

- - +
-
-

Description: this should be like ncase's "drag the voter" examples, with a normalizing score voter. This voter should have a series of circles, where the closest one intersects the closest candidate and the farthest one the farthest candidate. Thus, as you moved the voter or candidates the circles would change size.

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try moving the losing yellow traingle candidate, and see what happens.

+
+

non-optimal

- - +

This should be a score voting scenario with 100% normalizing voters. the voter median around (0,0), and candidates square (3,0), triangle (-2,0), pentagon (-4,0). Pentagon voters are not enthusiastic enough about triangle so square wins, even though triangle is higher utility. Removing penta fixes the problem.

+ +
+
+
+ +

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

-
-

Strategists win

- - +

groups of voters at (-4,0)non-normalizing and (4,0)normalizing. Cands at (-2.5,.5), (-2,0), (0,0), (2,0), (2.5,.5). (2,0) wins.

@@ -180,15 +177,14 @@

Normalizing Voter

-
-
+
+

Strong Strategic Voter

Almost like strategic approval.

- - +
@@ -198,16 +194,15 @@

Strong Strategic Voter Even stronger strategic voters could only choose the best of the frontrunners.

-

-
-
+
+
+

Best Frontrunner

And everybody you like better.

- - +
@@ -215,15 +210,14 @@

Best Frontrunner

-
-
+
+

Not the Worst Frontrunner

Just everybody you like better.

- - +

These two strategies are really just different extremes of the strong strategic voter.

@@ -238,15 +232,14 @@

Not the Worst Frontrunne

-
-
+
+

Playing Chicken

- - +
@@ -258,25 +251,23 @@

Not the Worst Frontrunne

-
-
+
+

Playing Chicken with Different Methods

- - +
-
-
+
+

Center Squeeze

- - +
@@ -284,20 +275,20 @@

Not the Worst Frontrunne

So, now I've explained why strategic voting makes things tricky, I can explain my two favorite voting methods: star voting and 3-2-1 voting.

+

+
+ +

Star voting

"Star", or more precisely, "s+ar", stands for "score plus automatic runoff." In this method, voters use the same ballot as score voting. Between the two candidates with the highest scores, the winner is the one that comes higher on more ballots. Here's a one-voter star election. You can choose between three kinds of strategy: normalized, moderately strategic, and strongly strategic. The first and last kinds you've seen before. The third is almost like a strongly strategic voter, except that the ratings may be changed by one to avoid giving a frontrunner the same score as any other candidate. Here's a one-voter election:

-
-
-

Star Strong

Keeps a space for the best.

- - +
@@ -306,15 +297,14 @@

Star Strong

And here's the chicken dilemma you saw above:

-
-
+
+

Chicken Star

- - +
@@ -325,15 +315,14 @@

3-2-1 voting

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

-
-
+
+

321 Strategic

Approval with an extra level.

- - +
@@ -342,15 +331,14 @@

321 Strategic

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

-
-
+
+

321 Chicken

- - +
@@ -360,549 +348,8 @@

321 Strategic

-
-
- - -
-
-

SANDBOX MODE! (link to just this)

-
-
-

- One hope for Sandbox Mode is that readers can debate with me and each other using this tool! - Not just telling me I'm wrong, but showing me I'm wrong. - For example – - - here's a model I made in Sandbox Mode, - showing an interesting argument against Approval & Score Voting. - Granted, this tool is very limited – it doesn't handle strategic voting or imperfect information – - but I think it's a start, and may help improve our Democratic Discourse™ -

-
-
-
- - - - - -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- -

- - - - -
-
- -

- click & drag
the candidates and the voter:
-

- - -
-
- -

It's a tough choice. Triangle's got some sharp points, but Square understands more sides! Alas, in the end, you can only vote for one.

- -

Of course, there's more than just one voter in an election. Let's simulate what an election would look like with 100+ voters.

- -
-
- -

- drag the candidates & voters around.
(to move voters, drag the middle of the crowd)
watch how that changes the election:
-

- - -
-
- -

Now let's consider a different election. Say Tracy Triangle is already beating Steven Square in the polls, and a third candidate, Henry Hexagon , sees this. (Hexagon's supporters like how he tackles problems from more angles) Inspired by her success, Hexagon swoops in and takes a political position close to Triangle's.

- -

Now, you'd think giving the voters more of what they want should result in a better choice, or at least, not result in a worse choice, right? Well...

-
-
- -

- - at first, beats .
- drag to just under ,
- and see what happens:
-

- - -
-
- -

That's right. Steven Square, our least popular candidate, now wins! This is because when you have two good candidates, they "steal" votes from each other, letting a bad third candidate win.

- -

This is called the spoiler effect. The most famous real-world example of this was in 2000, when Ralph Nader "stole" votes from Al Gore, letting George Bush win. And though the spoiler effect didn't play a big role in 2016, its impact could still be felt.

- -

In the Republican primary, one anti-establishment nominee, Trump, ran against sixteen GOP establishment nominees, who all "stole" votes from each other, letting Trump grab the nomination, easily. As for the Democratic primary, fear of splitting the vote prevented Sanders from running as independent. And to cap it all off, there was always the worry that other candidates like Johnson, Stein, and McMullin could spoil the election.

- -

But again, this is not about the 2016 U.S. election.

- -

This is about designing a democracy that people can trust.

- -

Despite so much hoopla around the 2016 election, a full half of Americans did not vote. Even of those who voted for Clinton/Trump, 20% of them said their candidates were untrustworthy, and voted for them anyway. And around the world, people's trust in their governments – or the trustworthiness of their governments – has never been lower. It's more than America at stake. It's every democracy in the world.

- -

...so yeah, no pressure.

- -

Rebuilding trust is a complex problem with no easy solutions. But I think there is an easy first step. It's a step that could get rid of our “lesser of two evils” problem, and give us citizens more choices, better choices. And yet, it won't be as daunting as fixing campaign finance or gerrymandering or lack of proportional representation, no, it'd just require changing a piece of paper, and how we count those pieces of paper.

- -

This idea is not the most important issue. It won't solve everything. But as a first step? It'd give us the biggest bang-for-buck.

- -

Let's talk about how to build a better ballot.

- -
- - - - -
- -

Now, some of you may have a couple objections!

- -

First objection. Why would the people in power change the voting method that got them in power? Well, the spoiler effect has cost both Dems & Reps a major election before. Getting rid of that glitch would be a win-win for major and minor parties! Also, voting reform is already picking up steam. Just last month, Maine adopted Instant Runoff, and Justin Trudeau, Canada's Cutie-In-ChiefCynic-in-Chief, will be moving his nation towards a better voting system in 2017. (UPDATE: actually, he didn't do that.)

- -

Second objection. Didn't some guy once prove that all voting methods will be unfair? Not quite. You're thinking of the infamous Impossibility Theorem by Kenneth Arrow, the mathematician in the 1950's who founded the whole study of voting methods.

- -

Two answers to that: 1) some voting methods can still be more fair than others, even if none are perfect. And 2) Kenneth Arrow's proof doesn't apply to all voting methods! That's a misconception. It only applies to voting methods where you rank candidates. Later, we'll see some voting methods where you don't rank candidates – along with other alternatives to our current, glitchy voting method.

- -

But first, let's take a closer look at the voting method we do have:

- -
-
- -

FIRST PAST THE POST (FPTP)

-

same as before. click & drag
the candidates and voter

- - -
-
- -

How To Count: Simply add up the votes. Whoever gets the most votes, wins.

- -

Sounds logical enough. But as you saw earlier, it can lead to a weird glitch, where having two good candidates can make the election go to a third bad candidate. This is why some people vote "strategically", voting not for their actual honest favorite, but voting for the lesser of two evils. And strategic voting is fine – but! – ask yourself this: how can we expect our elected officials to be honest, when our voting method itself doesn't let us be honest?

- -

So, to fix the spoiler effect, other voting methods have been suggested. Such as...

-
-
- -

RANKED VOTING

-

again, click & drag

- - - -
-
- -

How To Count: There's actually several different ways to count these kinds of ballots. Here, I'll just show you the top three:

- -

- Instant Runoff Voting (IRV): - This one is the most popular alternative to First Past The Post (FPTP). - Australia and Ireland use it in national elections. - San Francisco, Minneapolis, and Portland, Maine use it in local elections. - And Justin Trudeau, Prime Man-ister of Canada, - is leaning towards Instant Runoff, too. -

- -

- (Note: Instant Runoff Voting is also called “Ranked Choice Voting”, - even though there's other ways to count ranked ballots. - IRV is also often just called “Alternative Vote”, - even though there's a flippin' dozen other voting methods. - Such selfish naming! Sheesh!) -

- -

IRV is a bit more complicated than FPTP, but here's how it works:

- -
    -
  1. Count up the #1 choices.
  2. -
  3. If someone has more than 50%, they win! END.
  4. -
  5. If not, eliminate the last-place loser.
  6. -
  7. Run a new "round" of the election, minus that loser.
  8. -
  9. Repeat until someone has 50% or more.
  10. -
- -

If that seems like too much, there is a much simpler method of counting ranked ballots...

- -

Borda Count: Simply add up the rank numbers. Like in golf, whoever has the lowest score, wins. Borda count is used in Slovenia and a bunch of tiny islands in Micronesia.

- -

But if you want an even nerdier way of voting, you could try...

- -

Condorcet Method: Run a simulated "election" between every pair of candidates, using the info on voters' ballots. IF there's a candidate who beats all other candidates in one-on-one "elections", that candidate wins the real election. However, that's a very big "IF". (as we'll see later...) The upside is, when this method does pick a winner, it's always the “theoretically best” candidate! Currently, this method is not being used by any governments, and is only being used by neeerrrrrds.

- -

So, those are the voting methods where you rank candidates – the ones that Kenneth Arrow proved would always be unfair in some big way! But what of voting methods where you don't rank candidates? They're less well-known, but now, at least you'll know 'em:

- -
-
- -

APPROVAL VOTING

-

yup, stiiiiill click & drag

- - - -
-
- -

How To Count: Simply add up the approvals. Whoever gets the most approvals, wins.

- -

Wait, picking more than one candidate? Doesn't that violate the one-vote-per-person rule? I hear you ask. Well, your vote was never a single check mark, your vote was always the whole ballot. And on this ballot, you get to honestly express all the candidates you approve of, not just your favorite or strategic second-favorite.

- -

But if you want a more expressive voting method, why not try...

- -
-
- -

SCORE VOTING

-

you guessed it

- - - -
-
- -

How To Count: Simply add up the ratings. Whoever has the highest average score, wins. Kind of like Amazon reviews, but with democracy. (Note: this is not a ranking method, because two candidates can have the same score.)

- -

So there's our top 6 voting methods: the one we use, and five popular alternatives. But how can we tell if these alternatives are actually better? What glitches might they have? And which voting method – if any – can we say is "the best"?

- -

Like before, let's simulate 'em.

- -
- - - - -
-

Remember that simulation of the spoiler effect from earlier? Well, here it is again, but now you can switch between the six different voting methods! Here's the "spoiler effect" simulation again. See how different voting methods deal with potential spoilers:

-
-
-

- drag to just under to create a spoiler effect.
- then compare the 6 different voting methods: -
- - (note: in the rare cases there's a tie, i just randomly pick a winner) - -

- - -
-
- -

As you could see, every voting method except First Past The Post is immune to the spoiler effect. So, that's it, right? Ding dong, the glitch is dead? Just pick any other alternative voting method and be done with it?

- -

But, alas. In getting rid of one glitch, some of these alternative voting methods create other glitches – for some, the cure is even worse than the disease.

- -

For example, here's a sim of Instant Runoff Voting. In the beginning, Tracy Triangle is already winning, and you're going to move the voters even closer to her. Obviously, if a candidate is already winning an election, and becomes even more popular, they should still win afterwards, right?

- -

You can probably guess where this is going...

-
-
- -

- drag the voters slowly up towards : -

- - - -
-
- -

What happened? - Originally, is eliminated in the first round, so - - goes against a weaker , and wins. - But when you move the voters closer to , - the loser changes! - So now, is eliminated in the first round, - which means goes against a stronger , - and loses.

- -

Under Instant Runoff, it's possible for a winning candidate to lose, by becoming more popular. What a glitch!

- -

How often does this actually happen in real life? There's a couple confirmed examples, and mathematicians estimate this glitch would happen about 14.5% of the time. But sadly, we can't know for sure, because governments usually don't release enough info about the ballots to reconstruct an IRV election & double-check the results.

- -

So, not only is Instant Runoff's glitch as undemocratic as First Past The Post's glitch, it's possibly worse – because while FPTP's counting method is simple and transparent, Instant Runoff is anything but. And a lack of transparency is an even deadlier sin nowadays, when our trust in government is already so low.

- -

(But wait! We'll be talking about the risk of strategic voting later. - Can IRV can make a comeback? Stay tuned...)

- -

So much for the most popular alternative. What about the second-most popular, Borda Count? In this next simulation, you move a losing candidate closer to another losing candidate. Under FPTP, the spoiler effect would split their votes, making both of them lose even more. But watch what happens under Borda Count instead...

- -
-
- -

- drag to just slightly left of : -

- - - -
-
- -

Yup. Borda Count has a reverse spoiler effect. Instead of one good candidate hurting another good candidate by moving closer, with Borda Count, one bad candidate can help another bad candidate by moving closer.

- -

Here's what happened: at first, some voters ranked - >>, - but when you moved closer to , - those voters then swung to ranking - >>, - hurting enough - to make her lose to .

- -

Still, Borda's not the worst, and at least it's simpler and more transparent than Instant Runoff. But how does Condorcet Method compare? When Condorcet picks a winner, it's always the “theoretically best” winner – but that's when it picks a winner.

- -

So far, I've just been simulating voters as a single group, with a center and some spread. But seeing how polarized politics is nowadays, one could imagine several groups of voters, with totally different centers. Now, Condorcet tries to pick the candidate who beats all other candidates in one-on-one races. But with polarized voters, you could end up with a Rock-Paper-Scissors-like loop, where a majority of voters prefer A to B, B to C, and C to A.

- -

In certain situations, the other voting methods just had glitches. In Condorcet, the voting method crashes. Try it out for yourself:

-
-
- -

- create your own “condorcet cycle”!
- move the voters in such a way that NOBODY wins: -

- - - -
-
- -

Now, in actual practice – not that any government actually uses this voting method – when Condorcet fails to find a winner, the election falls back to another method like Borda Count. But if you do that, it'll get the glitches of its backup method. So it goes.

- -

First Past The Post. Instant Runoff. Borda Count. Condorcet Method. Those were all the voting methods that use ranking – the ones that our math boy, Kenneth Arrow, proved would always be unfair or glitchy in some big way. What about the voting methods that don't use ranking, like Approval & Score voting? Well...

- -

...I couldn't come up with a simulation to show their flaws. Because, in theory, they don't have many big flaws.

- -

- But that's a really, really, really big “in theory!” - It may be that, in practice, strategic voters use Approval & Score Voting exactly like First Past The Post – - only approving or giving 5 stars to their top candidate, and disapproving or giving 1 star to all others, - even if they actually like the others. - (See FairVote's critique of Approval Voting, and defense of Instant Runoff) -

- -

- Then again, even if Approval & Score Voting disincentivize you from expressing an honest second choice, - FPTP and IRV punish you for expressing an honest first choice. - Besides, if Approval can be "gamed", then that goes double for IRV. - (See this mathematician's critique of FairVote's critique, and defense of Approval) - So, in the end... [confused shrugging sounds]

- -

- We're gonna need a hecka lot more simulations. -

- -

- So, below is a chart - (source), - showing the results of 2.2 million simulations. - A huge variety of scenarios were tested. All-honest voters. - All-strategic voters. Half-honest, half-strategic. - Voters who know each others' preferences. - Voters who don't know each others' preferences. - Voters who only sorta-know each others' preferences. - And so on. - You can tell that a real mathematician made this chart, - because it's makin' my eyes bleed: -

- -

- -

- Each voting method's results is shown as an ugly-blue bar. - The further to the right a voting method is, the more it "maximizes happiness" for the voters. - The higher up a voting method is, the simpler it is. - And a bar's width shows the range of a voting method's performance, - given different ratios of honest-to-strategic voters. -

- -

- The first thing to note is that strategic voting makes voters less happy than honest voting - – in all voting methods! I was very surprised when I first learnt that. - (But it makes sense, if you think about, say, a crowded room full of people trying to talk. Any one person can be "strategic" by shouting over others, but if everybody is "strategic", nobody can hear anybody, and all you're left with is sore throats and sad peeps.)

- -

The other thing to note is which voting methods make people the happiest. If you have mostly honest voters, Score Voting is best. (with Borda Count a close second) And if you have mostly strategic voters, then both Approval & Score Voting are best. (and with strategic voters, IRV does just as bad as FPTP)

- -

However, those are still computer simulations. How would these different voting methods play out in real life? Well, we can't just get the DeLorean up to 88, go back in time before the 2016 election, change the voting method, and see what would happen...

- -

...or can we?!

- -

No, no we can't. But last month, researchers did something close enough. - A polling study asked 1,000+ U.S. registered voters to rank & rate the six presidential candidates, - to simulate who would've won the (popular) vote under different voting methods! - (But keep in mind that if we had a different voting method in the primaries, we'd have different candidates entirely. - So take this study with a pillar of salt.) - The results: under Instant Runoff, Condorcet, and Approval Voting, the winner would've been Hillary Clinton. But under Score Voting, the winner would've been Donald Trump. And under Borda Count, the winner would've been... uh... Gary Johnson? -

- -

?????

- -
-
-

- a guesstimated model of the 2016 US election?...
- - how Clinton wins IRV, - Trump wins Score, - and Johnson wins Borda?? - -

- -
-
- -

Anyway.

- -

Before we wrap all this up – remember Kenneth Arrow? The infamous mathematician who founded the study of voting methods in the 1950's? Well, in an interview 60 years later, Kenneth Arrow had this to say, about which voting method he likes most now:

- -

- “Well, I’m a little inclined to think that score methods [like Approval & Score Voting] where you categorize in maybe three or four classes [so, giving a score out of 3 or 4, not 10 or 100] probably – in spite of what I said about manipulation [strategic voting] – is probably the best.”

- -

That's as strong an endorsement as you'll ever squeeze out of a math-head.

-
- - - - -
- -

ahem

- -

- DEAR JUSTIN “TOTES ADORBZ” TRUDEAU
- (and everyone else around the world pushing for voting reform) -

- -

Thank you for taking this small but powerful first step! We've known for way too long that our current voting method – First Past The Post – forces voters to be dishonest, creates a polarizing "lesser of two evils" scenario, and screws over both major and minor candidates.

- -

- However, you're probably only considering Instant Runoff Voting. - Which, to be fair, is better than than First Past The Post, - and if it's a choice between just those two, definitely go for Instant Runoff. - But IRV still has a glitch as undemocratic as FPTP's – - and worse, in our age of distrust, Instant Runoff's lack of transparency may be deadly for democracy. - Yes, sure, IRV was the best voting method we could come up with... - in 1870. - And since then, IRV has dominated the conversation, - unwittingly framing the whole voting reform debate as “simple vs expressive”. -

- -

- But that is a false choice. Thanks to computer simulations, real-life studies, and a bunch of math nerds, - we now know of voting methods that are both simple and expressive. -

- -

- Personally, I'm leaning towards Score Voting. - It's simple, very expressive, and already familiar to anyone who's seen Amazon's or Yelp's “five star” review method. - But that's just my humble opinion. - You could also make the case that Approval Voting is more practical, - because it's even simpler, and would already work with existing voting machines! - All you'd need to do is change the instructions from - “vote for the candidate you like” to “vote for the candidates you like”. -

- -

- Or maybe I'm completely wrong about Instant Runoff Voting, and it's actually pretty okay. - Heck, you could even go for Borda Count, as a hilarious prank. -

- -

I won't claim to know which voting method is The Best™. I shall keep open this discussion, just as long as we have this discussion. For three reasons:

- -

1) If I claim one voting method is the best, end of story, all the social-choice-theory nerds will be on my butt, yelling, BUT NICKY WHAT ABOUT QUADRATIC VOTE BUYING

- -

2) We still need to test these alternative voting methods with actual experience, - not just annoying internet flame wars between IRV advocates and Score Voting advocates theory. - All the more reason for small towns, local states, and nations like Canada to be pioneers, to bravely experiment!

- -

3) Keeping the discussion going is what democracy is.

- -

A recent study found that in many Western countries – from Sweden to Australia to the United States – support for democracy has plummeted over the last several generations. - In 2011, almost a full quarter of young Americans said democracy was a "bad" or "very bad" way to run a country. - And today, one in six Americans say it'd be "good" or "very good" to be under actual military rule. -

- -

Our age of distrust goes a lot deeper than the technical details of a voting method. There isn't gonna be One Weird Trick to fix democracy. But as a first step, a low-hanging fruit, a way to show that, yes, you will make the method respond to the needs and wants and pains and hopes and dreams of your people – well, fixing our voting method's a good start as any.

- -

Because, this isn't just about trying to build a better ballot.

- -

This is about trying to build a better democracy.

- -

<3,
- ~ Nicky Case

- -
- -

P.S: Since you've read & played this all the way, here, have a bonus! - A “Sandbox Mode” of the election simulator, with up to five candidates. - You can also save & share your very own custom election scenario with others. Happy simulating!

-
- - -
+

SANDBOX MODE! (link to just this)

- +

@@ -1251,6 +698,28 @@

SANDBOX MODE! + + + + diff --git a/play/css/election.css b/play/css/election.css index 1e056589..8378c28e 100644 --- a/play/css/election.css +++ b/play/css/election.css @@ -136,3 +136,13 @@ input[type=range]{ top: 340px; left: 350px; } + +#savelink{ + position: absolute; + top: 340px; + left: 460px; + width: 82px; + height: 15px; + padding: 8px; + font-size: 12px; +} \ No newline at end of file diff --git a/play/js/main_ballot.js b/play/js/main_ballot.js index c9bde98f..e8ef9b8a 100644 --- a/play/js/main_ballot.js +++ b/play/js/main_ballot.js @@ -138,7 +138,7 @@ function main(config){ selectUI(); console.log(initialConfig) }; - document.body.appendChild(resetDOM); + document.querySelector("#center").appendChild(resetDOM); }; diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 653e8b56..8099c95d 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -824,7 +824,7 @@ function main(config){ selectUI(); }; - document.body.appendChild(resetDOM); + document.querySelector("#center").appendChild(resetDOM); /////////////////////////// @@ -922,7 +922,7 @@ function main(config){ saveDOM.onclick = function(){ _saveModel(); }; - document.body.appendChild(saveDOM); + document.querySelector("#center").appendChild(saveDOM); // The share link textbox linkText = document.createElement("input"); @@ -932,16 +932,7 @@ function main(config){ linkText.onclick = function(){ linkText.select(); }; - if (config.sandboxsave) { - //skip - } else { - linkText.style.position = "absolute"; - linkText.style.top = "340px"; - linkText.style.left = "460px"; - linkText.style.height = "30px"; - linkText.style.width = "90px"; - } - document.body.appendChild(linkText); + document.querySelector("#center").appendChild(linkText); // Create a URL... (later, PARSE!) // save... ?d={s:[system], v:[voterPositions], c:[candidatePositions], d:[description]} diff --git a/sandbox/fixedbox.html b/sandbox/fixedbox.html index c13015d7..66ddc16f 100644 --- a/sandbox/fixedbox.html +++ b/sandbox/fixedbox.html @@ -9,9 +9,9 @@ -
+
diff --git a/slides.html b/slides.html index 3c208afa..1cb4416d 100644 --- a/slides.html +++ b/slides.html @@ -7,20 +7,23 @@ +
-
TARGET 1
-
TARGET 2
-
TARGET 3
-
TARGET 4
+
TARGET 1
+
TARGET 2
+
TARGET 3
+
TARGET 4
+ +
From 3eadc8ee320660ab27d0a983cbf36e160755b03c Mon Sep 17 00:00:00 2001 From: Paretoman Date: Mon, 14 Aug 2017 20:50:25 -0400 Subject: [PATCH 105/120] kinda works, not good. --- css/slides.css | 17 ++++++++++------- newer.html | 10 ++++++---- play/css/fixedbox.css | 8 ++++---- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/css/slides.css b/css/slides.css index 03bb3ebe..c3b484a2 100644 --- a/css/slides.css +++ b/css/slides.css @@ -4,8 +4,9 @@ div.target { } #main { - width: 60%; - float: right; + left: 500px; + right: 0px; + position:absolute; } #main div.target { @@ -18,13 +19,14 @@ div.target { #nav { position: absolute; - font-size: 7px; + font-size: 10px; top: 0%; + left: 340px; } #nav nav { position: fixed; - width: 5%; + width: 100px; height: 20%; } @@ -43,8 +45,9 @@ div.target { } #fixedbox { - top: 20%; - width: 35%; - height: 80%; + top: 0%; + left: 0%; + width: 500px; + height: 100%; position: fixed; } \ No newline at end of file diff --git a/newer.html b/newer.html index b5cc37b3..761d2ff8 100644 --- a/newer.html +++ b/newer.html @@ -45,12 +45,13 @@ - - - - - - - - - --> -
+ +
-
+ +
-
+

SANDBOX MODE! (link to just this)

@@ -379,6 +408,8 @@

SANDBOX MODE! SANDBOX MODE! - - - From 4938d2bc0d094930821326c461f8c1b01ff4c0d8 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 25 Aug 2017 12:14:17 -0400 Subject: [PATCH 108/120] added ability to keep config from last time. When the user makes some adjustments and then scrolls down the page, when he scrolls back up, he'll see the example the way he left it, instead of seeing it reset to initial settings. --- css/slides.css | 3 +++ play/js/Presets.js | 2 +- play/js/main_sandbox.js | 56 ++++++++++++++++++++++++++++------------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/css/slides.css b/css/slides.css index dc9db07a..12bc10df 100644 --- a/css/slides.css +++ b/css/slides.css @@ -1,3 +1,6 @@ +/*todo: fix horizontal scrolling +*/ + div.target { margin: 0; padding: 0; diff --git a/play/js/Presets.js b/play/js/Presets.js index 4b4e3ee1..45b7141f 100644 --- a/play/js/Presets.js +++ b/play/js/Presets.js @@ -487,7 +487,7 @@ kindayee: "can", } - return config + return config //JSON.parse(JSON.stringify(config)) } diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 8099c95d..d049f316 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -37,7 +37,9 @@ function main(config){ var allnames = ["systems","voters","candidates","strategy","percentstrategy","unstrategic","frontrunners","poll","yee"] var doms = {} // for hiding menus, later var stratsliders = [] // for hiding sliders, later - + var confighistory = {} + var config_name = null + var loadDefaults = function() { // Defaults... config = config || {}; @@ -672,18 +674,13 @@ function main(config){ var presetconfig = [] for (i in presetnames) presetconfig.push({name:presetnames[i],realname:presetdescription[i],htmlname:presethtmlnames[i],margin:4}) - var onChoosepresetconfig = function(data){ - var firstletter = data.htmlname[0] + var presethelper = function(config_name) { + var firstletter = config_name[0] if (firstletter == 'e' || firstletter == 's' || firstletter == 'f') { - config = loadpreset(data.htmlname) - loadDefaults() - model.reset(true); - model.onInit(); - setInPosition(); - selectUI(); + config = loadpreset(config_name) } else if (firstletter == 'b') { - //document.location.replace(data.htmlname); - ballotconfig = loadpreset(data.htmlname) + //document.location.replace(config_name); + ballotconfig = loadpreset(config_name) var systemTranslator = {Plurality:"FPTP",Ranked:"Condorcet",Approval:"Approval",Score:"Score",Three:"3-2-1"} config = {} config.system = systemTranslator[ballotconfig.system] @@ -694,12 +691,33 @@ function main(config){ if (ballotconfig.showChoiceOfFrontrunners) {config.featurelist.push("frontrunners")} if (ballotconfig.showChoiceOfStrategy) {config.featurelist.push("strategy")} config.oneVoter = true - loadDefaults() - model.reset(true); - model.onInit(); - setInPosition(); - selectUI(); } + return config + } + + var onChoosepresetconfig = function(data){ + // first, save the current config for later + + // config_name is still old here... and we update below + if (config_name != null) { + jsave(0) // Update the config so we can save it. the 0 means don't output to console. + confighistory[config_name] = config // always update + } + + // update the config name + config_name = data.htmlname + // now we load the new config + if ( Object.keys(confighistory).includes(config_name) ) { + // have we been here before? If so, then get the last config + config = confighistory[config_name] + } else { + config = presethelper(config_name) + } + loadDefaults() + model.reset(true); + model.onInit(); + setInPosition(); + selectUI(); }; window.choosepresetconfig = new ButtonGroup({ label: "pick a preset:", @@ -813,9 +831,11 @@ function main(config){ resetDOM.innerHTML = "reset"; resetDOM.onclick = function(){ - config = JSON.parse(JSON.stringify(initialConfig)); // RESTORE IT! - config.frontrunnerSet = new Set(config.afrontrunnerArray); // stringify a set is not good + config = presethelper(config_name) + // config = JSON.parse(JSON.stringify(initialConfig)); // RESTORE IT! // Reset manually, coz update LATER. + + loadDefaults() model.reset(true); model.onInit(); setInPosition(); From 967f8ba89ddb31d0feec694d3a98bc14335b078a Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 25 Aug 2017 12:53:09 -0400 Subject: [PATCH 109/120] ballot default positions --- play/js/main_sandbox.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/play/js/main_sandbox.js b/play/js/main_sandbox.js index 2e280fd6..f8b8be20 100644 --- a/play/js/main_sandbox.js +++ b/play/js/main_sandbox.js @@ -686,11 +686,16 @@ function main(config){ config.system = systemTranslator[ballotconfig.system] var s = ballotconfig.strategy || "zero strategy. judge on an absolute scale." config.voterStrategies = [s,s,s] - config.preFrontrunnerIds = ballotconfig.preFrontrunnerIds + config.preFrontrunnerIds = ballotconfig.preFrontrunnerIds || ["square","triangle"] config.featurelist = [] if (ballotconfig.showChoiceOfFrontrunners) {config.featurelist.push("frontrunners")} if (ballotconfig.showChoiceOfStrategy) {config.featurelist.push("strategy")} config.oneVoter = true + + // some defaults + config.candidatePositions = config.candidatePositions || [[41,50],[173,95],[216,216]] + config.voterPositions = config.voterPositions || [[81,92]] + } return config } From 72afaeeebc8bbdb7de6514977b400da15387367f Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 25 Aug 2017 13:13:18 -0400 Subject: [PATCH 110/120] small fix - don't open external page when clicking nav links --- newer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newer.html b/newer.html index 0b716f2f..61b541bf 100644 --- a/newer.html +++ b/newer.html @@ -31,7 +31,7 @@ - + From 39af82ac547c57168da51eb81e13d13d600bc80b Mon Sep 17 00:00:00 2001 From: Paretoman Date: Fri, 25 Aug 2017 14:06:10 -0400 Subject: [PATCH 111/120] works, but work in progress on getting the nav buttons to point directly at their examples. --- css/slides.css | 8 ++++++++ js/slides.js | 25 +++++++++++++++++++++++-- newer.html | 44 +++++++++++++++++++++++++++++--------------- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/css/slides.css b/css/slides.css index 12bc10df..400fdd1e 100644 --- a/css/slides.css +++ b/css/slides.css @@ -55,4 +55,12 @@ div.target { #fixedbox { width: 500px; height: 100%; +} + +.anchor { + display: block; + position: relative; + height: 400px; + margin-top: -400px; + visibility: hidden; } \ No newline at end of file diff --git a/js/slides.js b/js/slides.js index 6177d79d..1ef7f251 100644 --- a/js/slides.js +++ b/js/slides.js @@ -9,7 +9,24 @@ var exampleLoaded = null //$("#main").css("width","500px") +var setshift = function() { + var window_height = $(window).height(); + // link into middle + // only really need to do this when the window is resized + var shift = .5*window_height - 2 + $(".anchor").each(function(){ + $(this).attr("height",shift) + $(this).attr("margin-top",-shift) + }) +} +$(window).on('resize', setshift) +$(window).on('load', setshift) +$(window).load(setshift) +$(document).ready(setshift) + $(window).on('scroll', function() { + setshift() + var window_height = $(window).height(); $('.target').each(function() { // this function runs on each text box and checks to see if the middle of the page is inside the box. @@ -21,7 +38,7 @@ $(window).on('scroll', function() { if(inView) { var id = $(this).attr('id'); $('#nav nav a').removeClass('active'); - $('#nav nav a[href=#'+ id +']').addClass('active'); + $('#nav nav a[href=#a_'+ id +']').addClass('active'); $(this).css('background-color',"#ddddee"); if (id!=old_div) { globalHtmlName = $(this).attr('id') + ".html" @@ -71,4 +88,8 @@ $(window).on('scroll', function() { n1.css("top",prejump+"px") } } -}); \ No newline at end of file + +}); + +// $("#nav a").attr("target","_self") //maybe +// $("#nav a").removeAttr("target") //better? \ No newline at end of file diff --git a/newer.html b/newer.html index 61b541bf..cee50840 100644 --- a/newer.html +++ b/newer.html @@ -85,7 +85,8 @@

Unstrategic voting

- + +
@@ -129,6 +130,7 @@

Lightly-strategic voting: "normalization"

+
@@ -145,6 +147,7 @@

Normalizing Voter

+
@@ -159,6 +162,7 @@

Normalizing Voter

+
@@ -180,6 +184,7 @@

Normalizing Voter

+
@@ -198,6 +203,7 @@

Strong Strategic Voter

+
@@ -213,6 +219,7 @@

Best Frontrunner

+
@@ -235,6 +242,7 @@

Not the Worst Frontrunne

+
@@ -254,6 +262,7 @@

Not the Worst Frontrunne

+
@@ -263,6 +272,7 @@

Not the Worst Frontrunne

+
@@ -279,6 +289,7 @@

Not the Worst Frontrunne

+
@@ -301,6 +312,7 @@

Star Strong

+
@@ -319,6 +331,7 @@

3-2-1 voting

+
@@ -335,6 +348,7 @@

321 Strategic

+
@@ -360,20 +374,20 @@

321 Strategic

+



















+

+

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

-
-
From 8bac59804fae7ee822a9b2b20b1ca0d8378de919 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 27 Aug 2017 20:14:54 -0400 Subject: [PATCH 113/120] layout: small fix --- css/slides.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/slides.css b/css/slides.css index 06b96119..00c7a5d0 100644 --- a/css/slides.css +++ b/css/slides.css @@ -7,9 +7,9 @@ div.target { } #main { - left: 540px; - max-width: 700px; + margin-left: 540px; position:relative; + right: 10px; } #main div.target { From 27de751ba82a6b784b42e7cb0be230bb6ac1f79a Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 27 Aug 2017 20:50:21 -0400 Subject: [PATCH 114/120] layout. small fixes --- css/slides.css | 8 ++++---- play/css/election.css | 7 ++++--- play/css/fixedbox.css | 14 +++++++++++--- sandbox/fixedbox.html | 2 +- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/css/slides.css b/css/slides.css index 00c7a5d0..859b7f2f 100644 --- a/css/slides.css +++ b/css/slides.css @@ -7,9 +7,9 @@ div.target { } #main { - margin-left: 540px; + margin-left: 500px; position:relative; - right: 10px; + right: 20px; } #main div.target { @@ -46,14 +46,14 @@ div.target { } #nav nav { - left: 340px; + left: 0; width: 100px; height: 20%; position: absolute; } #fixedbox { - width: 500px; + width: 458px; height: 100%; } diff --git a/play/css/election.css b/play/css/election.css index 8378c28e..cc8df7b5 100644 --- a/play/css/election.css +++ b/play/css/election.css @@ -11,17 +11,18 @@ Election/Sandbox design: height: 320px; } #left{ - width:220px; - padding-right: 20px; + margin-top: 20px; + width:230px; height: 371px; + overflow-y: auto; } #center{ width:320px; height: 370px; } #right{ + margin-top: 20px; width: 220px; - padding-left: 20px; overflow-y: auto; } #caption{ diff --git a/play/css/fixedbox.css b/play/css/fixedbox.css index bacf6d98..d3ea20a3 100644 --- a/play/css/fixedbox.css +++ b/play/css/fixedbox.css @@ -1,3 +1,11 @@ +#center { + margin-left: 120px; +} + +#right{ + margin-left: 0px; +} + #reset, #save{ background: #fff; color: #888; @@ -19,13 +27,13 @@ #reset{ position:absolute; top: 330px; - left: 0px; + left: 120px; } #save{ position:absolute; top: 330px; - left: 110px; + left: 230px; } #description_container{ @@ -54,7 +62,7 @@ textarea, input{ #savelink{ position: absolute; top: 330px; - left: 220px; + left: 340px; width: 82px; height: 15px; padding: 8px; diff --git a/sandbox/fixedbox.html b/sandbox/fixedbox.html index 66ddc16f..57249bd8 100644 --- a/sandbox/fixedbox.html +++ b/sandbox/fixedbox.html @@ -10,8 +10,8 @@
-
+ From 4daad383d073b1c953f09e6a24343f99102880b9 Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 27 Aug 2017 21:40:48 -0400 Subject: [PATCH 115/120] layout. centered vertically. nav inside iframe. --- js/slides.js | 18 +++++++++++++++--- newer.html | 17 ----------------- play/css/fixedbox.css | 31 +++++++++++++++++++++++++++++++ sandbox/fixedbox.html | 20 ++++++++++++++++++++ 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/js/slides.js b/js/slides.js index cbc5011a..fe07288e 100644 --- a/js/slides.js +++ b/js/slides.js @@ -36,8 +36,12 @@ $(window).on('scroll', function() { // var inView = $(window).scrollTop() >= $(this).offset().top if(inView) { var id = $(this).attr('id'); - $('#nav nav a').removeClass('active'); - $('#nav nav a[href=#a_'+ id +']').addClass('active'); + + $('#nav nav a[href="../newer.html#a_'+ id +'"]', $("#fixedbox").contents()).addClass('active'); + + $("#fixedbox").contents().find('#nav nav a').removeClass('active'); + $('#nav nav a[href="../newer.html#a_'+ id +'"]', $("#fixedbox").contents()).addClass('active'); + // $("#fixedbox").contents().find('#nav nav a[href="../newer.html#a_'+ id +'"]').addClass('active'); $(this).css('background-color',"#ddddee"); if (id!=old_div) { globalHtmlName = $(this).attr('id') + ".html" @@ -77,14 +81,22 @@ $(window).on('scroll', function() { console.log("topper") n1.css("position","absolute") n1.css("top", topoffirst) + n1.css("margin-top","0") } else if (belowbottomoflast) { console.log("bottomer") n1.css("position","absolute") n1.css("top",bottomoflast-sidebarheight+"px") + n1.css("margin-top","0") } else { // sticky console.log("sticky") n1.css("position","fixed") - n1.css("top",prejump+"px") + if (window_height > 770) { + n1.css("top","50%") + n1.css("margin-top","-385px") + } else { + n1.css("top","0") + n1.css("margin-top","0") + } } } diff --git a/newer.html b/newer.html index e48fca89..a37bb38d 100644 --- a/newer.html +++ b/newer.html @@ -375,23 +375,6 @@

321 Strategic

diff --git a/play/css/fixedbox.css b/play/css/fixedbox.css index d3ea20a3..9549c977 100644 --- a/play/css/fixedbox.css +++ b/play/css/fixedbox.css @@ -70,3 +70,34 @@ textarea, input{ } +#nav { + font-size: 10px; + top: 0%; + +/* just for start*/ + position: absolute; + line-height: 1em; +} + +#nav a { + border-bottom: 1px solid #666; + color: #333; + display: block; + padding: 1px; + text-align: center; + text-decoration: none; +} + +#nav a:hover, #nav a.active { + background: #666; + color: #fff; +} + +#nav nav { + left: 0; + width: 100px; + height: 20%; + position: absolute; +} + + diff --git a/sandbox/fixedbox.html b/sandbox/fixedbox.html index 57249bd8..8ddbe079 100644 --- a/sandbox/fixedbox.html +++ b/sandbox/fixedbox.html @@ -7,8 +7,28 @@ + +
From 0fa9c933f72bf3737b2e7b0e3b3b2a903b5869da Mon Sep 17 00:00:00 2001 From: Paretoman Date: Sun, 27 Aug 2017 22:42:35 -0400 Subject: [PATCH 116/120] small fixes --- newer.html | 18 +++++++++--------- play/css/sandbox.css | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/newer.html b/newer.html index a37bb38d..015944c0 100644 --- a/newer.html +++ b/newer.html @@ -52,8 +52,6 @@
-
-
+

You read/played Nicky Case's great explainer on voting methods. And you still want more!

@@ -86,6 +85,7 @@

Unstrategic voting

+
@@ -364,16 +364,16 @@

321 Strategic





















-
-

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

-
- + +
+ +
+

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

+
+
- - -
diff --git a/play/css/sandbox.css b/play/css/sandbox.css index eab408c0..8bbcae4c 100644 --- a/play/css/sandbox.css +++ b/play/css/sandbox.css @@ -56,4 +56,20 @@ textarea, input{ height: 15px; padding: 8px; font-size: 12px; +} + + +#left{ + overflow-y: visible; + width: 230px; +} + + +#left{ + margin-top: 0px; + padding-right: 10px; +} +#right{ + margin-top: 0px; + margin-left: 20px; } \ No newline at end of file From 31b36f6ddc2cea9aef9e8fdf45b316c4d6450e5b Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Fri, 8 Sep 2017 08:24:24 -0400 Subject: [PATCH 117/120] Use mod, not random, for percentStrategy --- play/js/Voters.js | 58 ++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/play/js/Voters.js b/play/js/Voters.js index 2b01a761..5e5de318 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -14,7 +14,7 @@ function dostrategy(x,y,minscore,maxscore,rangescore,strategy,preFrontrunnerIds, dist2a.push(dist2) scores[c.id] = getScore(dist2); } - + var radiusFirst = radiusStep * (minscore + .5) var radiusLast = radiusStep * (maxscore - .5) var scoresfirstlast = {scores:scores, radiusFirst:radiusFirst , radiusLast:radiusLast, dottedCircle:dottedCircle} @@ -55,7 +55,7 @@ function dostrategy(x,y,minscore,maxscore,rangescore,strategy,preFrontrunnerIds, for (var i = 0; i < ls; i++) { var index = canAid.indexOf(preFrontrunnerIds[i]) if (index > -1) {shortlist.push(index)} - } + } } // find min and max of shortlist @@ -63,7 +63,7 @@ function dostrategy(x,y,minscore,maxscore,rangescore,strategy,preFrontrunnerIds, var n=Infinity var mi=null var ni=null - for (var i = 0; i < ls; i++) { + for (var i = 0; i < ls; i++) { var d1 = dista[shortlist[i]] if (d1 > m) { m = d1 // max @@ -96,17 +96,17 @@ function dostrategy(x,y,minscore,maxscore,rangescore,strategy,preFrontrunnerIds, } scores[canAid[i]] = score } - + // boundary condition correction // scores[canAid[mi]] = minscore scores[canAid[ni]] = maxscore - // if there's just one frontrunner than set him last + // if there's just one frontrunner than set him last // unless he's the closest to you - if (lf==1 && strategy != "normalize") { + if (lf==1 && strategy != "normalize") { var n1 = n var n1i = ni - for (var i = 0; i < lc; i++) { + for (var i = 0; i < lc; i++) { var d1 = dista[i] if (d1 < n1) { n1 = d1 //min @@ -128,14 +128,14 @@ function dostrategy(x,y,minscore,maxscore,rangescore,strategy,preFrontrunnerIds, // find best candidate and make sure that only he gets the best score var n1 = n var n1i = ni - for (var i = 0; i < lc; i++) { + for (var i = 0; i < lc; i++) { var d1 = dista[i] if (d1 < n1) { n1 = d1 //min n1i = i } } - for (var i = 0; i < lc; i++) { + for (var i = 0; i < lc; i++) { var c = canAid[i] if (scores[c]==maxscore && i!=n1i) { scores[c]=maxscore-1; @@ -170,15 +170,15 @@ function ScoreVoter(model){ self.getBallot = function(x, y, strategy){ - + var scoresfirstlast = dostrategy(x,y,minscore,maxscore,scorearray,strategy,self.model.preFrontrunnerIds,self.model.candidates,self.radiusStep,self.getScore) - + self.radiusFirst = scoresfirstlast.radiusFirst self.radiusLast = scoresfirstlast.radiusLast self.dottedCircle = scoresfirstlast.dottedCircle var scores = scoresfirstlast.scores return scores - + }; self.drawBG = function(ctx, x, y, ballot){ @@ -250,15 +250,15 @@ function ThreeVoter(model){ self.getBallot = function(x, y, strategy){ - + var scoresfirstlast = dostrategy(x,y,minscore,maxscore,scorearray,strategy,self.model.preFrontrunnerIds,self.model.candidates,self.radiusStep,self.getScore) - + self.radiusFirst = scoresfirstlast.radiusFirst self.radiusLast = scoresfirstlast.radiusLast self.dottedCircle = scoresfirstlast.dottedCircle var scores = scoresfirstlast.scores return scores - + }; self.drawBG = function(ctx, x, y, ballot){ @@ -324,8 +324,8 @@ function ApprovalVoter(model){ }; self.getBallot = function(x, y, strategy){ - - + + var scoresfirstlast = dostrategy(x,y,0,1,[0,1],strategy,self.model.preFrontrunnerIds,self.model.candidates,self.radiusStep,self.getScore) var scores = scoresfirstlast.scores self.drawApprovalRadius = (scoresfirstlast.radiusFirst + scoresfirstlast.radiusLast) * .5 @@ -568,9 +568,9 @@ var _drawSlices = function(ctx, x, y, size, slices, totalSlices){ startingAngle = endingAngle; } - + if (self.model.yeeon) { - // Just draw a circle. + // Just draw a circle. ctx.strokeStyle = 'rgb(0,0,0)'; ctx.lineWidth = 1; // border ctx.beginPath(); @@ -605,7 +605,7 @@ function GaussianVoters(config){ // this config comes from addVoters in main_san self.setType = function(newType){ self.type = new newType(self.model); }; - + self.percentStrategy = config.percentStrategy self.strategy = config.strategy self.unstrategic = config.unstrategic @@ -632,7 +632,7 @@ function GaussianVoters(config){ // this config comes from addVoters in main_san } else if (self.num==3){ spacings = [0, 10, 11, 12, 15, 20, 30, 50, 100]; } - + // Create 100+ points, in a Gaussian-ish distribution! var points = [[0,0]]; self.points = points; @@ -665,23 +665,19 @@ function GaussianVoters(config){ // this config comes from addVoters in main_san self.ballots = []; self.update = function(){ self.ballots = []; - - //randomly assign voter strategy based on percentages, but using the same seed each time - // from http://davidbau.com/encode/seedrandom.js - Math.seedrandom('hi'); - + for(var i=0; i Date: Fri, 8 Sep 2017 08:34:31 -0400 Subject: [PATCH 118/120] off-by-one error fix --- play/js/Voters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/play/js/Voters.js b/play/js/Voters.js index 5e5de318..d4298076 100644 --- a/play/js/Voters.js +++ b/play/js/Voters.js @@ -672,7 +672,7 @@ function GaussianVoters(config){ // this config comes from addVoters in main_san var y = self.y + p[1]; var r1 = (1861*i) % 100; - if (r1 <= self.percentStrategy) { + if (r1 < self.percentStrategy) { var strategy = self.strategy // yes } else { var strategy = self.unstrategic; // no e.g. "zero strategy. judge on an absolute scale." From cf9cbf05b8104745508a52f16db582ca0fecaf4c Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Fri, 8 Sep 2017 10:00:12 -0400 Subject: [PATCH 119/120] yet another version of the page --- oncemore.html | 741 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 741 insertions(+) create mode 100644 oncemore.html diff --git a/oncemore.html b/oncemore.html new file mode 100644 index 00000000..e4079921 --- /dev/null +++ b/oncemore.html @@ -0,0 +1,741 @@ + + + + + + To Build an Even Better Ballot? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

I wanted to start this voting exploration off with a topical joke about how it relates to the latest election travesty. But if I do that, it will seem dated as soon as the next election travesty comes along. So instead I'll use something that totally won't seem dated 20 years from now: a Twitter feed.

+ + + + + +

Never fear. I have two more voting methods to teach you about, and I hope I can convince you that they're the best yet.

+ +

Who's "me"? I'm Jameson Quinn, a statistics student at Harvard and a board member of the Center for Election Science. I'm not as good a designer or interactive programmer + as Nicky, as you can see from the title above. But I have spent a lot of time thinking about voting methods.

+ +

I'm also not as cool as Nicky, but I'm going to pretend to be. If my pale imitation of their chatty tone puts you off, then... well, I guess you can wait for my peer-reviewed paper.

+ +

So, the story so far: FPTP voting is horrible. There's all kinds of other voting methods that would be better. We're looking for the one that's best. Some activists think that's Instant Runoff Voting (IRV), but Nicky and I both disagree; it can prematurely eliminate centrists, and requires centralized counting. Nicky says they lean towards score voting, and I can see why: it's easy to understand, and in all the simulations Nicky built, it does a great job of satisfying all the little dot-on-screen voters.

+ +

By the end of this interactive, you're going to understand the three methods I consider the best. One of them Nicky already showed you: approval voting, which is great because it's so simple and because it has absolutely no downsides versus FPTP. The other two are newer, but they use similar basic ideas to what you've already seen. I hope you like all three methods.

+ +

But before I show you the new methods, I have to show you why score voting isn't already the greatest method possible. So I have to explain strategic voting.

+ +

Unstrategic voting

+ +

Remember how Nicky's voters worked in Score Voting? They just gave each candidate a number based on the absolute distance. Like this:

+ + +
+ +
+ +
+
+ +

UNSTRATEGIC BALLOT

+

Judge, don't choose.

+ + +
+
+

Description: this should just be an unstrategic score voter, as in ncase's thing. Allow ballot picture to show 0 scores.

+ +

But notice something about that ballot? For many positions of the voter and candidate, the ballot doesn't include a score of 5 or a score of 0. If you actually voted like that, you'd be giving up on some of your voting power. Say Triangle is your favorite, and you give them a score of 3, which also happens to be their average score. If Square wins with a score of 3.2, you're going to feel very silly for not giving a triangle a 5, in order to pull their average up as high as you can.

+ +

Digression: median systems

+ + skip this digression + +

Ever watched the Olympics? In events like figure skating, there are a number of Olympic judges from different countries. In order to prevent any one judge from having too much influence, they use a "trimmed mean": they throw away the highest and lowest scores before they take the average.

+ +

Olympic judges are supposedly supposed to be unbiased. But for voters, there's nothing wrong with having political opinions. (I mean, obviously your opinions, dear reader, are the best, and everybody else should just listen to you. But much as I'd like to, I can't force them to.) So let's imagine voting used the olympic system.

+ +

Throwing away just one highest and lowest score, with thousands or millions of voters, obviously wouldn't make an appreciable difference. So we'd have to throw away some more scores. And, why not? Let's throw away a few more while we're at it.

+ +

When should we stop? When there's just 1 or 2 scores left to take the average. But if you do that, most people wouldn't called that a "trimmed mean" anymore; they'd just call it the median, the middle number.

+ +

There are several voting methods that use the median to find the winner. (It turns out that can lead to a lot of ties, so you need a tiebreaker system to avoid that.) In the 1910s, over a dozen US cities, starting with Grand Junction, CO, used "Bucklin voting", a median-based system using a hybrid ranked/rated ballot. More recently, voting theorists Balinski and Laraki have proposed Majority Judgment, a median-based method using a rated ballot that's now been used in a number of competitions.

+ +

Using the median reduces the incentives for a single voter to strategize. After all, unless you happen to be the exact median rating for a candidate, the only thing that matters about the rating you gave them is whether it's above or below the median.

+ +

Still, large groups of voters can still get a strategic advantage. The larger the voting bloc, the greater the chance is that the median rating for a given candidate happens to be a voter in that bloc.

+ +

I used to think that median voting methods were the best. But then I did the simulations I'll talk about below, and they were merely OK; not much better outcomes than approval voting, but without the simplicity. I still think they're hugely better than FPTP and a bit better than IRV, but I'm not sold enough on them for it to be worth my time programming them in to Nicky's simulator.

+ + +

Lightly-strategic voting: "normalization"

+ +

As I suggested above, in the real world, in score voting and similar methods, most voters will want to make sure that their ballot contains at least one candidate each at the top rating and at the bottom rating. The simplest way to do that (even though the name sounds complicated and math-y) is "normalization". That just means that you set the top and bottom ratings to be however good your favorite and least-favorite candidates are, and then spread the rest of the ratings evenly between that.

+ +

Here's an example of a "normalizing" voter for you to play with:

+ +
+ +
+ +
+
+ +

Normalizing Voter

+

Best is 5. Worst is 1.

+ + +
+ +
+

Description: this should be like ncase's "drag the voter" examples, with a normalizing score voter. This voter should have a series of circles, where the closest one intersects the closest candidate and the farthest one the farthest candidate. Thus, as you moved the voter or candidates the circles would change size.

+ +

As soon as voters are using strategy in score voting — even a very slight amount of strategy, such as normalization — it is no longer fully exempt from impossibility theorems like Arrow's theorem. In particular, it no longer obeys independence of irrelevant alternatives (IIA); adding or removing a losing candidate can change how voters normalize, and thus change who wins. For instance, in the simulation below, try moving the losing yellow traingle candidate, and see what happens.

+ +
+
+ +
+
+ +

+ non-optimal
+

+ +
+
+

This should be a score voting scenario with 100% normalizing voters. the voter median around (0,0), and candidates square (3,0), triangle (-2,0), pentagon (-4,0). Pentagon voters are not enthusiastic enough about triangle so square wins, even though triangle is higher utility. Removing penta fixes the problem.

+ + +
+
+ +
+ +
+

But a bigger problem than IIA violation, which in the real world is relatively hard to engineer or take advantage of, is the issue of differential voting power. In the following election, one of the groups of voters normalizes, and the other one doesn't. The two groups are the same size, but the normalizing group gets a candidate they like a lot better.

+ +
+
+ +

+ Strategists win
+

+ +
+
+

groups of voters at (-4,0)non-normalizing and (4,0)normalizing. Cands at (-2.5,.5), (-2,0), (0,0), (2,0), (2.5,.5). (2,0) wins.

+ +

Is that kind of thing realistic? Perhaps not in the form above; few voters would be so unstrategic as not to normalize. But actually, normalizing as above is a pretty weak strategy. To strategize even more strongly, voters could somehow assess which two candidates were the frontrunners, and use them as the endpoints for normalization. Mostly, this means casting an approval-like ballot that gives every candidate either a 5 or a 0. For instance, in the election below, the voter believes that the red hexagon and the blue square are the frontrunners. Compare the strongly strategic voter below with the normalized voter in the second example above.

+ + +
+
+ +
+
+ +

Strong Strategic Voter

+

Almost like strategic approval.

+ + +
+
+ +

Single-voter example with 3 candidates and a voter who normalizes based on only the 2 of them.

+ +

Just as normalized voters can have more voting power than naive voters, strongly strategic voters can have more than normalized voters (as long as they are not too far off in guessing the frontrunners). This is a potential weakness of score voting.

+ +

Even stronger strategic voters could only choose the best of the frontrunners.

+ +
+
+ +
+
+ +

Best Frontrunner

+

And everybody you like better.

+ + +
+
+ +

A more risk-averse, safe strategic voter could avoid the worst frontrunner by voting for everyone better.

+ +
+ +
+ +
+
+ +

Not the Worst Frontrunner

+

Just everybody you like better.

+ + +
+
+

These two strategies are really just different extremes of the strong strategic voter.

+ +

Is approval voting immune to this kind of voting strategy? No; in fact, in the early seventies, mathematicians Gibbard and Satterthwaite both independently proved the theorem which bears their names, showing that no non-dictatorial voting method with more than 2 options is entirely immune to strategy. Unlike Arrow's theorem, which Nicky discussed, this one goes for any kind of voting method — ranked, rated, or whatever. So yes, approval voting is more resistant to strategy than score; but not immune.

+ +

(Note: advocates for IRV sometimes garble this point by saying that in approval voting the best strategy is to "bullet vote" for only your favorite candidate, and that this would lead it to devolve back to FPTP. That's just wrong; if voters are strategically voting for somebody other than their favorite in FPTP, then there's no way it would make sense for them to bullet vote in approval. Approval voting isn't perfect, but it simply does not break down to FPTP.)

+ +

One scenario where approval becomes a factor is called the "chicken dilemma". Imagine 3 groups of voters, with 25%, 30%, and 45% of the vote respectively. Say that the first two groups both prefer each other over the third, so that either of them could beat that third opponent by 55% to 45%. Whichever of the first two groups strategically gives fewer approvals to its rival will win... unless neither of them gives enough, in which case the opponent will win. This is called a "chicken dilemma" because it's like a game of chicken between the voters for the two similar rivals: they can "swerve" and let their second-favorite win, or they can "drive straight" and either win (if the other side swerves) or crash (if the other side doesn't).

+ +

Here's that scenario in sandbox form. The slider on the right controls the percent of the smallest group that is strongly strategic between triangle and square; all the rest of the voters use normalized strategy (that is, approve any candidate better than the average of their favorite and least-favorite).

+ + +
+
+ +
+
+ +

+ Playing Chicken
+

+ +
+
+ +

Clumps of voters at (x,y,size): (-2,1,6); (-2,-1,4)slider; (3,0,10).

+ + +

The "chicken dilemma" is a genuinely tough situation for almost any voting method. The motivations for the two rival factions to vote strategically are hard to minimize safely. Voting methods that go too far out of their way to punish strategic voters in this scenario tend to get the wrong answer in other, more-common scenarios like center squeeze. Look at how these various methods deal with both of these situations:

+ + + +
+
+ +
+
+ +

+ Playing Chicken with Different Methods
+

+ +
+
+ +
+
+ +

+ Center Squeeze
+

+ +
+
+ +

two different sandboxes. One repeats chicken dilemma case from above but also lets you switch voting methods (plurality, IRV, approval, score). The other one has center squeeze.

+ +

So, now I've explained why strategic voting makes things tricky, I can explain my two favorite voting methods: star voting and 3-2-1 voting.

+ +
+
+ +
+ +
+

Star voting

+ +

"Star", or more precisely, "s+ar", stands for "score plus automatic runoff." In this method, voters use the same ballot as score voting. Between the two candidates with the highest scores, the winner is the one that comes higher on more ballots. Here's a one-voter star election. You can choose between three kinds of strategy: normalized, moderately strategic, and strongly strategic. The first and last kinds you've seen before. The third is almost like a strongly strategic voter, except that the ratings may be changed by one to avoid giving a frontrunner the same score as any other candidate. Here's a one-voter election:

+
+
+ +

Star Strong

+

Keeps a space for the best.

+ + +
+
+ +

one-voter star election

+ +

And here's the chicken dilemma you saw above:

+ +
+
+ +
+
+ +

+ Chicken Star
+

+ +
+
+ +

chicken dilemma with star

+ +

3-2-1 voting

+ +

In 3-2-1 voting, voters rate each candidate "Good", "OK", or "Bad". To find the winner, you first narrow it down to three semifinalists, the candidates with the most "good" ratings. Then, narrow it further to two finalists, the candidates with the fewest "bad" ratings. Finally, the winner is the one preferred on more ballots. Here's a ballot to play with:

+ +
+
+ +
+
+ +

321 Strategic

+

Approval with an extra level.

+ + +
+
+ +

one-voter 3-2-1

+ +

And here's the chicken dilemma. Note "moderately strategic" doesn't change the result from "normalized". So unlike in star voting, candidates wouldn't have to go negative against their nearby rivals in order to ensure that their voters would at least be moderately strategic and wouldn't just normalize.

+ +
+
+ +
+
+ +

+ 321 Chicken
+

+ +
+
+ +

chicken dilemma with 3-2-1

+ +
+



















+
+ +
+ +
+

Putting it all together, here's a sandbox for you to try out all the different systems and to make your own scenarios:

+
+ +
+ + + + + + + + + +
+
+

SANDBOX MODE! (link to just this)

+ +
+
+

+ One hope for Sandbox Mode is that readers can debate with me and each other using this tool! + Not just telling me I'm wrong, but showing me I'm wrong. + For example – + + here's a model I made in Sandbox Mode, + showing an interesting argument against Approval & Score Voting. + Granted, this tool is very limited – it doesn't handle strategic voting or imperfect information – + but I think it's a start, and may help improve our Democratic Discourse™ +

+
+
+ + + + + +
+
+ + +
+ +
+
PUBLIC DOMAIN
+ Zero rights reserved. + I'm giving away + all my art/code/words, + so that you + teachers, mathematicians, hobbyists, activists, and policy wonks + can use them however you like! + This is for you. + Get my source code on GitHub! +
+
+ +
+ + +
+ +
“BUT WHAT CAN I DO?”
+ +

+ For citizens: Remember, think global, but act local. + Change from the bottom-up lasts longer. + If you're in the US, + find your representative + and badger 'em. + If you're in Canada, + find your Member of Parliament + and badger 'em. + Also if you're Canadian, + fill out the MyDemocracy.ca survey before the end of 2016! + This survey has a few questions specifically about voting reform! + (sadly, the question is still framed as "simple vs expressive". + that is why i've been so gung-ho about Approval & Score, + and maybe a bit too mean towards IRV) +

+ +

+ For learners: + Watch CGP Grey's Politics in the Animal Kingdom series! + It's charming, and covers more ground than I did here – it explains + gerrymandering, proportional representation, and more. + Also, read Gaming The Vote by + William Poundstone. + It's a thrilling read, + with dramatic human stories of crooks & conmen trying to game our glitchy voting systems – + and sometimes, succeeding. +

+ +

+ For teachers: + This entire "explorable explanation" is public domain, copyright-free, + meaning you already have permission to use this freely in your classes! + You can even use the Sandbox Mode to create your own material, + or as a tool for students to make something on their own. +

+ +

+ For coders: + This is all open source! + So you can get my code on GitHub, and remix it to your heart's content. + (sorry in advance for my messy code) +

+ +

+ Check out these organizations: + Though they may differ on what voting method they like best, + they all have a common goal: to reform the one we have. + Electology likes Approval Voting most, + FairVote likes Instant Runoff most, + and RangeVoting.org likes Score Voting most. +

+ +
ON THE SHOULDERS OF GIANTS
+

+ This "explorable explanation" was directly inspired by these two projects: +

+ +

+ Voting Sim Visualization by Ka-Ping Yee (2005) + was a real eye-opener. + (hat tip to Bret Victor for sharing it with me!) + I've heard lots of written debate over FPTP vs IRV vs Condorcet vs Approval vs blah blah blah, + but I'd never seen their difference visualized so clearly! + It gave me instant insight. + And it actually changed my mind – I used to think IRV was pretty good, + but after seeing IRV's messiness (as shown above), I realized it's actually kinda stinky cheese. +

+

+ However, even this brilliant visualization was still too abstract. + And since it wasn't interactive, I couldn't test the many questions & scenarios that came to mind. + So that's why my second inspiration was... +

+ +

+ Up and Down the Ladder of Abstraction + by Bret Victor (2011). + It's one of the web's earliest "explorable explanations" (also a term Bret coined) + and it is gorgeous. + Obviously, I borrowed the format of mixing words & "games" to explain things, + but I also followed the formula of starting concrete – one voter – + then moving up to the more abstract – a whole election. +

+

+ + You can learn more about Explorable Explanations here. +

+

+ And last but not least, thank you to all the math & policy nerds + who spent way too much time thinking about all this. +

+ +
+ STAY IN TOUCH, MAYBE?
+

+ Every once in a while, I'll fall into an endless rabbithole – + like this one on voting methods – and slowly crawl my way out, bloodied and bruised, + with a new interactive thing for you! + If you wanna find out + when I finally get around to making new shtuff, you can... +

+ +

+ And if you wanna see more of my past projects, + check out my wobsite! +

+

+ See you again soon! Have a Happy New Year 2017, or try to, anyway. +

+ +
+ + +
+
A BIG THANKS TO ALL MY
+
SUPPORTERS
+ + + +
+
aimee jarboe
+
frank leon rose
+
jared cosulich
+
louis-jean teitelbaum
+
matt hughes
+
micah cowan
+
michael alan huff
+
natalie sun
+
noel lehmann
+
phil dougherty
+
tom cascio
+
tom knowles
+
+
+
+
+ Adam M. Smith
+ Alex Dytrych
+ Andrew
+ Andy
+ Artemiy Solopov
+ Aschelon
+ ben fei
+ Benjamin Riggs
+ Bob Wise
+ Brandon
+ Brent Werness
+ Brian Wu
+ Bruno Guerrero
+ Buster Benson
+ Casey Ross
+ Charlie McIlwain
+ Christopher
+ Colin
+ Colin
+ Cort Stratton
+ Craig Steele
+ Daniel Horowitz
+ Daniel Shiffman
+ Dave Tu
+ David Smit
+ Dylan Meconis
+ Fahrstuhl
+ Feiya Wang
+ Forrest Oliphant
+ Frank Leon Rose
+ Henry Reich
+ Iñaki
+ J. Hu
+ Jacob Christian Munch-Andersen
+ Jacques Frechet
+ James Hogan
+ Janusz Leidgens
+ John_Ca
+ Johnny Owens
+ Joseph Perry
+ Joshua Horowitz
+ Julia Karmo
+ Karen Cooper
+ Kat Suricata
+ Kate Fractal
+ Kathryn Long
+ Kevin
+ Kevin Wang
+
+
+ Klemen Slavic
+ kuerqing1024
+ Linda Booth Sweeney
+ Maic Lopez Saenz
+ Matt "Kupo" Roszak
+ Matt Warren
+ May-Li Khoe
+ Mekki MacAulay
+ Micah Cowan
+ Michael Duke
+ Michelle Brown
+ Michelle Kelly
+ Milan Pingel
+ Monika Denes
+ Mustafa Alic
+ Nick Schrag
+ Nikita
+ Noah Swartz
+ Pablo Lopez Soriano
+ Pat Mächler
+ Peter McEvoy
+ Philip Tibitoski
+ Piotr Migdal
+ Rachel Nabors
+ Raphael D'Amico
+ Richard Hackathorn
+ Rob Napier
+ Roland Tanglao
+ Ryan Barker
+ Sam Anderson
+ Sam Maynard
+ Samira Nedungadi
+ Sarah Barbour
+ sarah mathys
+ SB Sigma
+ Seanny123
+ Serguei Filimonov
+ Sigpipe
+ Sylvain Francis
+ Syria Carys Sirlay
+ T_Caramel
+ TisGood
+ Tony Onodi
+ Traci Lawson
+ Yona
+ Yu-Han Kuo
+ Zach Smith
+ Zoe Bogner +
+
+
+
AND SPECIAL THANKS TO
+
+
+ Alex Dytrych
+ Alex Jaffe
+ Brian Bucklew
+ Chris Walker
+ Christine Zhang
+ Dan Zajdband
+ Daniel Cook
+ Droqen
+ Jason Grinblat
+
+
+ Jessie Salz
+ Lisa Charlotte Rost
+ Martin Shelton
+ Patrick Dubroy
+ Pietro Passarelli
+ Sandhya Kambhampati
+ Tanya Short
+
+
+
+
+ +
+
+ sharing is caring! + +
+
+ + + + + + + From 097e6be24383a3e61545a3f501c6b40a29296a81 Mon Sep 17 00:00:00 2001 From: Jameson Quinn Date: Sun, 4 Feb 2018 18:59:06 -0500 Subject: [PATCH 120/120] check in my work --- oncemore.html | 41 ++++++------ play/js/Presets.js | 156 ++++++++++++++++++++++++++++----------------- 2 files changed, 120 insertions(+), 77 deletions(-) diff --git a/oncemore.html b/oncemore.html index e4079921..aba569a8 100644 --- a/oncemore.html +++ b/oncemore.html @@ -63,44 +63,45 @@
-

I wanted to start this voting exploration off with a topical joke about how it relates to the latest election travesty. But if I do that, it will seem dated as soon as the next election travesty comes along. So instead I'll use something that totally won't seem dated 20 years from now: a Twitter feed.

+

I wanted to start this voting exploration off with a topical joke about how this isn't just about the latest election travesty. But if I do that, it will seem dated as soon as the next election travesty comes along. So instead I'll just put a twitter feed here, which will always have a new topical joke. Because of course a twitter feed totally will not seem dated a few years from now.

+

As the joke(s) above hopefully conveyed, voting (at least in places like Canada, the US, and the UK) is broken on a level far deeper than just the latest travesty. That's because in these places, we use the worst voting method imaginable. This method is called by various names: Americans usually call it "plurality", Brits call it "first past the post" (FPTP or FPP), and some voting geeks like me call it "choose-one plurality" to focus attention on its worst feature, the ballot that restricts you to choosing just one candidate.

-

Never fear. I have two more voting methods to teach you about, and I hope I can convince you that they're the best yet.

+

(Note: throughout this exploration, when I say "you", I'll be talking about you as a voter.)

-

Who's "me"? I'm Jameson Quinn, a statistics student at Harvard and a board member of the Center for Election Science. I'm not as good a designer or interactive programmer - as Nicky, as you can see from the title above. But I have spent a lot of time thinking about voting methods.

+

Choose-one ballot

+ +

To illustrate how broken choose-one plurality is, I'm going to get to an election with three candidates: Steven Square , Tracy Triangle , and Hana Hexagon . But before we have a full election, lets look at a world where you are the only voter. In this world, there are exactly two political axes (for example, “left vs. right” and “globalist vs. nationalist”), and everybody cares equally about both. So you'll prefer candidates who are closer to them on both axes combined.

+ +
+ +
+ +
+
+
+
+ +

Go ahead; play around with this. You can drag the voter (that is, you) and the candidates around the "issue space", and see how your ballot and thus the winner changes.

+ +

OK, done now? You probably got bored pretty quickly. Just picking the closest candidate isn't much of a choice.

+ +

Let's see how this works out when you have more than one voter and more than 2 candidates.

-

I'm also not as cool as Nicky, but I'm going to pretend to be. If my pale imitation of their chatty tone puts you off, then... well, I guess you can wait for my peer-reviewed paper.

-

So, the story so far: FPTP voting is horrible. There's all kinds of other voting methods that would be better. We're looking for the one that's best. Some activists think that's Instant Runoff Voting (IRV), but Nicky and I both disagree; it can prematurely eliminate centrists, and requires centralized counting. Nicky says they lean towards score voting, and I can see why: it's easy to understand, and in all the simulations Nicky built, it does a great job of satisfying all the little dot-on-screen voters.

-

By the end of this interactive, you're going to understand the three methods I consider the best. One of them Nicky already showed you: approval voting, which is great because it's so simple and because it has absolutely no downsides versus FPTP. The other two are newer, but they use similar basic ideas to what you've already seen. I hope you like all three methods.

-

But before I show you the new methods, I have to show you why score voting isn't already the greatest method possible. So I have to explain strategic voting.

-

Unstrategic voting

-

Remember how Nicky's voters worked in Score Voting? They just gave each candidate a number based on the absolute distance. Like this:

-
-
- -
-
-

UNSTRATEGIC BALLOT

-

Judge, don't choose.

-
-
-

Description: this should just be an unstrategic score voter, as in ncase's thing. Allow ballot picture to show 0 scores.

But notice something about that ballot? For many positions of the voter and candidate, the ballot doesn't include a score of 5 or a score of 0. If you actually voted like that, you'd be giving up on some of your voting power. Say Triangle is your favorite, and you give them a score of 3, which also happens to be their average score. If Square wins with a score of 3.2, you're going to feel very silly for not giving a triangle a 5, in order to pull their average up as high as you can.

diff --git a/play/js/Presets.js b/play/js/Presets.js index b5ab9853..eaf396bb 100644 --- a/play/js/Presets.js +++ b/play/js/Presets.js @@ -1,7 +1,7 @@ var loadpreset = function(htmlname) { - if (htmlname == "election1.html") { + if (htmlname == "2pb.html") { config = { - + system: "FPTP", candidates: 3, @@ -13,7 +13,7 @@ var loadpreset = function(htmlname) { } } else if (htmlname == "election2.html") { config = { - + features:1, system: "IRV", @@ -26,9 +26,9 @@ var loadpreset = function(htmlname) { } } else if (htmlname == "election3.html") { config = { - + features:1, - + system: "Borda", candidates: 3, @@ -49,7 +49,7 @@ var loadpreset = function(htmlname) { voters: 3 } } else if (htmlname == "election5.html") { - config = + config = { features:2, @@ -57,7 +57,7 @@ var loadpreset = function(htmlname) { candidates: 3, candidatePositions: [[40,115+10],[177,185+10],[224,118+10]], - + voters: 2, voterPositions: [[75,120+10],[225,120+10]] @@ -76,23 +76,23 @@ var loadpreset = function(htmlname) { } } else if (htmlname == "election7.html") { - config = + config = { featurelist: ["percentstrategy"], voterPercentStrategy: [100,0,0], - + system: "Score", candidates: 3, candidatePositions: [[150-30,150],[150+130,150],[150+50,150]], - + voters: 1, voterPositions: [[150,150]], voterStrategies: ["normalize"] - + } } else if (htmlname == "election8.html") { - config = + config = { /* @@ -101,13 +101,13 @@ var loadpreset = function(htmlname) { candidates: 3, candidatePositions: [[100,150],[150,150+100],[300-100,150]], - + voters: 2, voterPositions: [[100,150],[300-100,150]], voterStrategies: ["normalize","zero strategy. judge on an absolute scale."], preFrontrunnerIds: ["square","hexagon"] */ - + candidatePositions: [[50,150],[250,150]], voterPositions: [[100,150],[200,150]], system: "Score", @@ -126,10 +126,10 @@ keyyee: "off", features: undefined, doPercentFirst: undefined, doFullStrategyConfig: undefined, - + } } else if (htmlname == "election9.html") { - config = + config = { features:3, @@ -137,16 +137,16 @@ doFullStrategyConfig: undefined, system: "Score", candidates: 3, - + voters: 2, voterPositions: [[200,160],[100,160]], voterStrategies: ["normalize","normalize"], voterPercentStrategy: [50,50], doFullStrategyConfig: true - + } } else if (htmlname == "election10.html") { - config = + config = { /* features:3, @@ -157,7 +157,7 @@ doFullStrategyConfig: undefined, candidatePositions: [[150-25,150-20], [150+20,150-20], [150,150+75]], - + voters: 3, voterPositions: [[150,150-70], [150,150+10], @@ -167,7 +167,7 @@ doFullStrategyConfig: undefined, preFrontrunnerIds: ['square','triangle','hexagon'], doFullStrategyConfig: true */ - + candidatePositions: [[121,149],[118,170],[194,159]], voterPositions: [[116,121],[116,184],[195,155]], system: "Approval", @@ -189,7 +189,7 @@ doPercentFirst: undefined, doFullStrategyConfig: undefined } } else if (htmlname == "election11.html") { - config = + config = { /* features:1, @@ -200,7 +200,7 @@ doFullStrategyConfig: undefined candidatePositions: [[150-25,150-20], [150+20,150-20], [150,150+75]], - + voters: 3, voterPositions: [[150,150-70], [150,150+10], @@ -211,7 +211,7 @@ doFullStrategyConfig: undefined doFullStrategyConfig: true, unstrategic: "normalize" */ - + candidatePositions: [[121,149],[118,170],[194,159]], voterPositions: [[116,121],[116,184],[195,155]], system: "Approval", @@ -233,7 +233,7 @@ doPercentFirst: undefined, doFullStrategyConfig: undefined } } else if (htmlname == "election12.html") { - config = + config = { /* features:3, @@ -245,7 +245,7 @@ doFullStrategyConfig: undefined [150+20,150-20], [150,150+75], [150+0,150+10]], - + voters: 3, voterPositions: [[150,150-70], [150,150+10], @@ -254,7 +254,7 @@ doFullStrategyConfig: undefined voterPercentStrategy: [100,100,100], preFrontrunnerIds: ['square','triangle','hexagon'] */ - + candidatePositions: [[145,155],[184,153],[106,157]], voterPositions: [[150,150]], system: "IRV", @@ -275,7 +275,7 @@ doPercentFirst: undefined, doFullStrategyConfig: undefined, } } else if (htmlname == "election13.html") { - config = + config = { /* features:3, @@ -286,7 +286,7 @@ doFullStrategyConfig: undefined, candidatePositions: [[150-25,150-20], [150+20,150-20], [150,150+75]], - + voters: 3, voterPositions: [[150,150-70], [150,150+10], @@ -295,7 +295,7 @@ doFullStrategyConfig: undefined, voterPercentStrategy: [100,100,100], preFrontrunnerIds: ['square','triangle','hexagon'] */ - + candidatePositions: [[121,149],[118,170],[194,159]], voterPositions: [[116,121],[116,184],[195,155]], system: "STAR", @@ -317,7 +317,7 @@ doPercentFirst: undefined, doFullStrategyConfig: undefined } } else if (htmlname == "election14.html") { - config = + config = { /* features:3, @@ -328,7 +328,7 @@ doFullStrategyConfig: undefined candidatePositions: [[150-25,150-20], [150+20,150-20], [150,150+75]], - + voters: 3, voterPositions: [[150,150-70], [150,150+10], @@ -337,7 +337,7 @@ doFullStrategyConfig: undefined voterPercentStrategy: [100,100,100], preFrontrunnerIds: ['square','triangle','hexagon'] */ - + candidatePositions: [[121,149],[118,170],[194,159]], voterPositions: [[116,121],[116,184],[195,155]], system: "3-2-1", @@ -359,7 +359,7 @@ doPercentFirst: undefined, doFullStrategyConfig: undefined } } else if (htmlname == "election15.html") { - config = + config = { candidatePositions: [[92,69],[210,70],[245,182],[149,250],[55,180]], voterPositions: [[150,150]], @@ -382,7 +382,7 @@ keyyee: "pentagon", kindayee: "can", } } else if (htmlname == "sandbox.html") { - config = + config = { description: "[type a description for your model here. for example...]\n\nLook, it's the whole shape gang! Steven Square, Tracy Triangle, Henry Hexagon, Percival Pentagon, and last but not least, Bob.", features: 4, @@ -393,7 +393,7 @@ kindayee: "can", doPercentFirst: true } } else if (htmlname == "fixedbox.html") { - config = + config = { description: "", features: 4, @@ -401,30 +401,55 @@ kindayee: "can", candidates: 5, voters: 1, } - } else if (htmlname == "ballot1.html") { - config = -{system: "Plurality"} + } else if (htmlname == "2pb.html") { + + config = +{ + candidatePositions: [[48,115],[250,150]], +voterPositions: [[149,129]], +features: undefined, +system: "FPTP", +candidates: 2, +voters: 1, +snowman: false, +oneVoter: true, +featurelist: ["voters","systems","candidates"], +sandboxsave: false, +doPercentFirst: undefined, +doFullStrategyConfig: undefined, +hidegearconfig: false, +preFrontrunnerIds: ["square","triangle"], +voterStrategies: ["zero strategy. judge on an absolute scale.","zero strategy. judge on an absolute scale.","zero strategy. judge on an absolute scale."], +description: "", +voterPercentStrategy: [0,0,0], +unstrategic: "zero strategy. judge on an absolute scale.", +keyyee: "off", +computeMethod: "ez", +filename: "fixedbox.html", +presethtmlname: "fixedbox.html", + +} } else if (htmlname == "ballot2.html") { - config = + config = {system: "Ranked"} } else if (htmlname == "ballot3.html") { - config = + config = {system: "Approval"} } else if (htmlname == "ballot4.html") { - config = + config = {system: "Score"} } else if (htmlname == "ballot5.html") { - config = + config = { system: "Score", strategy: "normalize" } } else if (htmlname == "ballot6.html") { - config = + config = { system: "Score", strategy: "best frontrunner", @@ -433,14 +458,14 @@ kindayee: "can", showChoiceOfStrategy: true } } else if (htmlname == "ballot7.html") { - config = + config = { system: "Score", strategy: "not the worst frontrunner", showChoiceOfFrontrunners: true } } else if (htmlname == "ballot8.html") { - config = + config = { system: "Score", strategy: "normalize frontrunners only", @@ -449,7 +474,7 @@ kindayee: "can", showChoiceOfStrategy: true } } else if (htmlname == "ballot9.html") { - config = + config = { system: "Score", strategy: "starnormfrontrunners", // for now we are using an "off-menu" option. We should make versions of each of hte strategies for star. @@ -457,7 +482,7 @@ kindayee: "can", showChoiceOfFrontrunners: true } } else if (htmlname == "ballot10.html") { - config = + config = { system: "Three", strategy: "starnormfrontrunners", @@ -465,7 +490,7 @@ kindayee: "can", showChoiceOfFrontrunners: true } } else if (htmlname == "ballot11.html") { - config = + config = { system: "Score", strategy: "best frontrunner", @@ -473,17 +498,34 @@ kindayee: "can", showChoiceOfFrontrunners: true, showChoiceOfStrategy: true } - } else if (htmlname == "ballot12.html") { - config = + } else if (htmlname == "epb3.html") { + config = { - system: "Score", - strategy: "not the worst frontrunner", - preFrontrunnerIds: ["square","triangle"], - showChoiceOfFrontrunners: true, - showChoiceOfStrategy: true +candidatePositions: [[52,46],[200,85],[234,238]], +voterPositions: [[139,179]], +description: "", +features: undefined, +system: "FPTP", +candidates: 3, +voters: 1, +snowman: false, +oneVoter: true, +featurelist: ["candidates"], +sandboxsave: true, +doPercentFirst: undefined, +doFullStrategyConfig: undefined, +hidegearconfig: false, +preFrontrunnerIds: ["square","triangle"], +voterStrategies: ["zero strategy. judge on an absolute scale.","zero strategy. judge on an absolute scale.","zero strategy. judge on an absolute scale."], +voterPercentStrategy: [0,0,0], +unstrategic: "zero strategy. judge on an absolute scale.", +keyyee: "off", +computeMethod: "ez", +filename: "fixedbox.html", +presethtmlname: "fixedbox.html", } // } else if (htmlname == "election.html") { - // config = + // config = }