author | rougeronj |
Fri, 23 Jan 2015 23:19:45 +0100 | |
changeset 142 | e424eed32f72 |
parent 86 | e944c017b8c8 |
permissions | -rw-r--r-- |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
1 |
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o;"undefined"!=typeof window?o=window:"undefined"!=typeof global?o=global:"undefined"!=typeof self&&(o=self),o.pianoroll=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
2 |
/** |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
3 |
* scripts/main.js |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
4 |
* |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
5 |
* This is the starting point for your application. |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
6 |
* Take a look at http://browserify.org/ for more info |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
7 |
*/ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
8 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
9 |
'use strict'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
10 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
11 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
12 |
var PIXI = require('pixi'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
13 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
14 |
// Config vars |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
15 |
var logger = false; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
16 |
var sceneWidth = 1920; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
17 |
var prHeight1 = 435; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
18 |
var prHeight2 = 645; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
19 |
var sceneHeight = prHeight1 + prHeight2; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
20 |
var sceneBgColor = 0xFFFFFF; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
21 |
var lineColor = 0x444444; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
22 |
var pixelsPerSecond1 = Math.floor(sceneWidth / 10); // nb of pixels per second |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
23 |
var manualFramerate = pixelsPerSecond1 / 4; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
24 |
var pixelsPerSecond2 = Math.floor(sceneWidth / 60); // nb of pixels per second |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
25 |
var lineInterval = 5000; // means line every 5 seconds |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
26 |
var nbLines = -1; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
27 |
var noteHeight = 110; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
28 |
var noteColors = [0xB90000, 0x4BDD71, 0xAF931E, 0x1C28BA, 0x536991]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
29 |
var colorsReg = {}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
30 |
// Vars |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
31 |
var noteDict = []; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
32 |
// Timecode method |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
33 |
var timePageLoaded = Date.now(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
34 |
var offsetMusic = false; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
35 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
36 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
37 |
//create an new instance of a pixi stage |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
38 |
var stage = new PIXI.Stage(sceneBgColor); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
39 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
40 |
//create a renderer instance. |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
41 |
var renderer = PIXI.autoDetectRenderer(sceneWidth, sceneHeight); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
42 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
43 |
//add the renderer view element to the DOM |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
44 |
document.getElementById('canvasContainer').appendChild(renderer.view); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
45 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
46 |
var uberContainer = new PIXI.DisplayObjectContainer(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
47 |
uberContainer.position.x = Math.floor(sceneWidth*9/10); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
48 |
uberContainer.position.y = 0; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
49 |
stage.addChild(uberContainer); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
50 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
51 |
var PianoRoll = require('./pianoroll.js') |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
52 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
53 |
// Init containers |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
54 |
var containerList = []; |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
55 |
containerList.push(new PianoRoll(uberContainer, 0, 0, prHeight1, true, pixelsPerSecond1, sceneWidth, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, prHeight1 / 128)); |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
56 |
containerList.push(new PianoRoll(uberContainer, 0, prHeight1, prHeight2, false, pixelsPerSecond2, sceneWidth, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, prHeight2 / 128)); |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
57 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
58 |
// Line between two containers |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
59 |
var graphics = new PIXI.Graphics(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
60 |
graphics.beginFill(0xFFFF00); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
61 |
graphics.lineStyle(1, lineColor); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
62 |
graphics.moveTo(0, prHeight1); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
63 |
graphics.lineTo(sceneWidth, prHeight1); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
64 |
graphics.endFill(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
65 |
stage.addChild(graphics); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
66 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
67 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
68 |
function replaceContainers(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
69 |
var diff = (Date.now() - timePageLoaded)/1000;// nb of seconds since page loaded |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
70 |
//console.log("replace ! diff1 = ", container1.x - Math.floor(-diff*pixelsPerSecond1), ", diff 2 = ", container2.x - Math.floor(-diff*pixelsPerSecond2)); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
71 |
for(var i=0;i<containerList.length;i++){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
72 |
containerList[i].moveTo(-diff); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
73 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
74 |
renderer.render(stage); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
75 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
76 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
77 |
function addNotes(data){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
78 |
if(!offsetMusic){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
79 |
// get difference between the current note timecode and my zero to set the difference between the canvas's zero and the music's zero |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
80 |
// in order to place in real time |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
81 |
var now = Date.now(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
82 |
var timeBetweenNowAndStart = now - timePageLoaded; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
83 |
offsetMusic = timeBetweenNowAndStart - data.content[1]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
84 |
//console.log("start: ", timePageLoaded, ", now: ", now, ", timeBetweenNowAndStart = ", timeBetweenNowAndStart, ", offsetMusic = ", offsetMusic); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
85 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
86 |
var note = data.content[3]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
87 |
var velocity = data.content[4]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
88 |
if(velocity===0){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
89 |
if(typeof noteDict[data.content[2]][note]!=='undefined'){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
90 |
// We close the note in container one |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
91 |
//console.log("coucou 2", data); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
92 |
var duration = data.content[1] - noteDict[data.content[2]][note].ts; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
93 |
for(var i=0;i<containerList.length;i++){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
94 |
// addNote(note, startTime, duration, velocity, canal) |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
95 |
containerList[i].addNote(note, noteDict[data.content[2]][note].ts, duration, noteDict[data.content[2]][note].velocity, data.content[2]); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
96 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
97 |
// delete entry |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
98 |
delete noteDict[data.content[2]][note]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
99 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
100 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
101 |
else{ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
102 |
if(typeof noteDict[data.content[2]]==='undefined'){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
103 |
noteDict[data.content[2]] = {}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
104 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
105 |
noteDict[data.content[2]][note] = {ts: data.content[1], velocity:velocity}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
106 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
107 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
108 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
109 |
function addLine(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
110 |
nbLines++; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
111 |
for(var i=0;i<containerList.length;i++){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
112 |
containerList[i].addLine(nbLines); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
113 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
114 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
115 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
116 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
117 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
118 |
// Socket management |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
119 |
var sock = null; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
120 |
var ellog = null; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
121 |
function log(m) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
122 |
if(logger){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
123 |
ellog.innerHTML += m + '\n'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
124 |
ellog.scrollTop = ellog.scrollHeight; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
125 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
126 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
127 |
window.onload = function(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
128 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
129 |
if(logger){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
130 |
ellog = document.getElementById('log'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
131 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
132 |
else{ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
133 |
document.body.removeChild(document.getElementById('log')); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
134 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
135 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
136 |
var wsuri; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
137 |
if (window.location.protocol === 'file:') { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
138 |
wsuri = 'ws://127.0.0.1:8090/broadcast'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
139 |
} else { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
140 |
wsuri = 'ws://' + window.location.hostname + ':8090/broadcast'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
141 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
142 |
wsuri = wsuri + '?channel=PIANOROLL&event_code='+eventCode; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
143 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
144 |
if ('WebSocket' in window) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
145 |
sock = new WebSocket(wsuri); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
146 |
} else if ('MozWebSocket' in window) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
147 |
sock = new MozWebSocket(wsuri); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
148 |
} else { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
149 |
log('Browser does not support WebSocket!'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
150 |
window.location = 'http://autobahn.ws/unsupportedbrowser'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
151 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
152 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
153 |
if (sock) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
154 |
sock.onopen = function(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
155 |
if(logger){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
156 |
log('Connected to ' + wsuri); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
157 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
158 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
159 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
160 |
sock.onclose = function(e) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
161 |
if(logger){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
162 |
log('Connection closed (wasClean = ' + e.wasClean + ', code = ' + e.code + ', reason = \'' + e.reason + '\')'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
163 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
164 |
sock = null; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
165 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
166 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
167 |
sock.onmessage = function(e) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
168 |
if(logger){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
169 |
log('Got message: ' + e.data); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
170 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
171 |
addNotes(JSON.parse(e.data)); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
172 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
173 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
174 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
175 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
176 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
177 |
// Init page and intervals |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
178 |
addLine(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
179 |
var moveInterval = window.setInterval(replaceContainers, 1000/manualFramerate); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
180 |
var verticalLinesInterval = window.setInterval(addLine, lineInterval); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
181 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
182 |
// Little inteval to show time |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
183 |
var nbSec = 0; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
184 |
var mySpan = document.getElementById('myspan'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
185 |
function updateTime(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
186 |
nbSec++; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
187 |
var hours = parseInt( nbSec / 3600 ) % 24; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
188 |
var minutes = parseInt( nbSec / 60 ) % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
189 |
var seconds = nbSec % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
190 |
var timeStr = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
191 |
mySpan.innerHTML = timeStr; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
192 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
193 |
var secondInterval = window.setInterval(updateTime, 1000); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
194 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
195 |
module.exports = { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
196 |
moveInterval: moveInterval, |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
197 |
verticalLinesInterval: verticalLinesInterval, |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
198 |
secondInterval: secondInterval |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
199 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
200 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
201 |
},{"./pianoroll.js":2,"pixi":"pixi"}],2:[function(require,module,exports){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
202 |
/** |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
203 |
* js/pianoroll.js |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
204 |
* |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
205 |
* pianoroll basic component |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
206 |
* |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
207 |
*/ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
208 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
209 |
'use strict'; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
210 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
211 |
var PIXI = require('pixi'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
212 |
var randomColor = require('randomColor'); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
213 |
|
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
214 |
function PianoRoll(parentContainer, xInit, yInit, height, linesDown, pixelsPerSecond, width, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, noteHeight){ |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
215 |
var _this = this; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
216 |
this.container = new PIXI.DisplayObjectContainer(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
217 |
this.container.position.x = xInit; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
218 |
this.container.position.y = yInit; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
219 |
parentContainer.addChild(this.container); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
220 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
221 |
this.linesDown = linesDown; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
222 |
this.height = height; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
223 |
this.pixelsPerSecond = pixelsPerSecond; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
224 |
this.width = width; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
225 |
this.noteColors = noteColors; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
226 |
this.colorsReg = colorsReg || {}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
227 |
this.lineColor = lineColor; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
228 |
this.lineInterval = lineInterval; |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
229 |
this.offsetMusic = offsetMusic || 0; |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
230 |
this.noteHeight = noteHeight; |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
231 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
232 |
this.addNote = function(note, startTime, duration, velocity, canal){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
233 |
//console.log("coucou 1", note, timeFromZero, ts, velocity, pixelsPerSecond, container, prHeight); |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
234 |
var beginX = (this.offsetMusic + startTime) * this.pixelsPerSecond / 1000; |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
235 |
var width = duration * this.pixelsPerSecond / 1000; |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
236 |
if((beginX+width) < Math.abs(this.container.x) - this.width) { |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
237 |
// not visible. do nothing |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
238 |
return; |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
239 |
} |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
240 |
// We draw the rectangle |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
241 |
var graphics = new PIXI.Graphics(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
242 |
//console.log("beginX = ", beginX, "canal = ", canal, "color = ", noteColor[canal], "width = ", width, "note = ", note, "velocity = ", velocity); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
243 |
var color = this.colorsReg[canal]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
244 |
if(typeof(color) === 'undefined') { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
245 |
var colorsRegSize = Object.keys(this.colorsReg).length; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
246 |
if(colorsRegSize < this.noteColors.length) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
247 |
color = this.colorsReg[canal] = this.noteColors[colorsRegSize]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
248 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
249 |
else { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
250 |
color = this.colorsReg[canal] = parseInt(randomColor({ luminosity: 'light', hue: 'random', format:'hex'}).replace(/^#/, ''), 16); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
251 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
252 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
253 |
graphics.beginFill(color, (velocity / 128)); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
254 |
var y = (128-note) * this.height / 128; // (128-note) because y = 0 is for note = 128 and y = 128 for note = 0 |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
255 |
graphics.drawRect(0, Math.floor(y - (noteHeight/2) + ((this.height / 128)/2)), width, noteHeight); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
256 |
graphics.endFill(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
257 |
graphics.x = beginX; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
258 |
this.container.addChild(graphics); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
259 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
260 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
261 |
this.addLine = function(lineNb){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
262 |
var graphics = new PIXI.Graphics(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
263 |
var x = -this.container.x; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
264 |
graphics.beginFill(0xFFFF00); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
265 |
graphics.lineStyle(1, this.lineColor); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
266 |
var y = this.linesDown ? this.height - 20 : 0; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
267 |
graphics.moveTo(x, y); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
268 |
graphics.lineTo(x, y + 20); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
269 |
graphics.endFill(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
270 |
this.container.addChild(graphics); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
271 |
// Add text |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
272 |
var totalSec = lineNb * this.lineInterval / 1000; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
273 |
var hours = parseInt( totalSec / 3600 ) % 24; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
274 |
var minutes = parseInt( totalSec / 60 ) % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
275 |
var seconds = totalSec % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
276 |
var timeStr = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
277 |
var fontObj = { font: '10pt Arial', fill: '#444444' }; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
278 |
var t = new PIXI.Text(timeStr, fontObj); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
279 |
t.x = x + 2; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
280 |
t.y = this.linesDown ? this.height - 15 : 2; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
281 |
this.container.addChild(t); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
282 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
283 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
284 |
this.moveTo = function(diffTime){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
285 |
this.container.x = Math.floor(diffTime*this.pixelsPerSecond); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
286 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
287 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
288 |
this.removePassedObjets = function(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
289 |
var nbChilds = _this.container.children.length; |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
290 |
var i = 0, childIsNowDisplayed = false, childrenToRemove = []; |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
291 |
while(i<nbChilds && !childIsNowDisplayed){ |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
292 |
var child = _this.container.children[i++]; |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
293 |
//console.log("remove ? ", child.x, child.width, ((child.x + child.width) < (Math.abs(_this.container.x) - _this.width))); |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
294 |
if(typeof(child) == 'undefined') { |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
295 |
continue; |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
296 |
} |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
297 |
if((child.x + child.width) < (Math.abs(_this.container.x) - _this.width)){ |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
298 |
childrenToRemove.push(child); |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
299 |
//console.log(" remove !!!"); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
300 |
} |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
301 |
else { |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
302 |
childIsNowDisplayed = true; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
303 |
//console.log(" childIsNowDisplayed"); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
304 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
305 |
} |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
306 |
childrenToRemove.forEach(function(child) { |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
307 |
_this.container.removeChild(child); |
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
308 |
}); |
84
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
309 |
//console.log("before : ", nbChilds, ", after : ", _this.container.children.length); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
310 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
311 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
312 |
// remove notes each scene width |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
313 |
//var removeInterval = window.setInterval(this.removePassedObjets, 1000 * sceneWidth / this.pixelsPerSecond ); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
314 |
window.setInterval(this.removePassedObjets, 1000 * this.width / this.pixelsPerSecond ); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
315 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
316 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
317 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
318 |
module.exports = PianoRoll; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
319 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
320 |
},{"pixi":"pixi","randomColor":"randomColor"}]},{},[1])(1) |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
321 |
}); |
86
e944c017b8c8
propagate small correctionson server
ymh <ymh.work@gmail.com>
parents:
84
diff
changeset
|
322 |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL2FwcC9qcy9tYWluLmpzIiwiL1VzZXJzL3ltaC9kZXYvcHJvamVjdHMvbW9ucy9kZXYvY2xpZW50L3BpYW5vcm9sbC9hcHAvanMvcGlhbm9yb2xsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogc2NyaXB0cy9tYWluLmpzXG4gKlxuICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4gKiBUYWtlIGEgbG9vayBhdCBodHRwOi8vYnJvd3NlcmlmeS5vcmcvIGZvciBtb3JlIGluZm9cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFBJWEkgPSByZXF1aXJlKCdwaXhpJyk7XG5cbi8vIENvbmZpZyB2YXJzXG52YXIgbG9nZ2VyID0gZmFsc2U7XG52YXIgc2NlbmVXaWR0aCA9IDE5MjA7XG52YXIgcHJIZWlnaHQxID0gNDM1O1xudmFyIHBySGVpZ2h0MiA9IDY0NTtcbnZhciBzY2VuZUhlaWdodCA9IHBySGVpZ2h0MSArIHBySGVpZ2h0MjtcbnZhciBzY2VuZUJnQ29sb3IgPSAweEZGRkZGRjtcbnZhciBsaW5lQ29sb3IgPSAweDQ0NDQ0NDtcbnZhciBwaXhlbHNQZXJTZWNvbmQxID0gTWF0aC5mbG9vcihzY2VuZVdpZHRoIC8gMTApOyAvLyBuYiBvZiBwaXhlbHMgcGVyIHNlY29uZFxudmFyIG1hbnVhbEZyYW1lcmF0ZSA9IHBpeGVsc1BlclNlY29uZDEgLyA0O1xudmFyIHBpeGVsc1BlclNlY29uZDIgPSBNYXRoLmZsb29yKHNjZW5lV2lkdGggLyA2MCk7IC8vIG5iIG9mIHBpeGVscyBwZXIgc2Vjb25kXG52YXIgbGluZUludGVydmFsID0gNTAwMDsgLy8gbWVhbnMgbGluZSBldmVyeSA1IHNlY29uZHNcbnZhciBuYkxpbmVzID0gLTE7XG52YXIgbm90ZUhlaWdodCA9IDExMDtcbnZhciBub3RlQ29sb3JzID0gWzB4QjkwMDAwLCAweDRCREQ3MSwgMHhBRjkzMUUsIDB4MUMyOEJBLCAweDUzNjk5MV07XG52YXIgY29sb3JzUmVnID0ge307XG4vLyBWYXJzXG52YXIgbm90ZURpY3QgPSBbXTtcbi8vIFRpbWVjb2RlIG1ldGhvZFxudmFyIHRpbWVQYWdlTG9hZGVkID0gRGF0ZS5ub3coKTtcbnZhciBvZmZzZXRNdXNpYyA9IGZhbHNlO1xuXG5cbi8vY3JlYXRlIGFuIG5ldyBpbnN0YW5jZSBvZiBhIHBpeGkgc3RhZ2VcbnZhciBzdGFnZSA9IG5ldyBQSVhJLlN0YWdlKHNjZW5lQmdDb2xvcik7XG5cbi8vY3JlYXRlIGEgcmVuZGVyZXIgaW5zdGFuY2UuXG52YXIgcmVuZGVyZXIgPSBQSVhJLmF1dG9EZXRlY3RSZW5kZXJlcihzY2VuZVdpZHRoLCBzY2VuZUhlaWdodCk7XG5cbi8vYWRkIHRoZSByZW5kZXJlciB2aWV3IGVsZW1lbnQgdG8gdGhlIERPTVxuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhc0NvbnRhaW5lcicpLmFwcGVuZENoaWxkKHJlbmRlcmVyLnZpZXcpO1xuXG52YXIgdWJlckNvbnRhaW5lciA9IG5ldyBQSVhJLkRpc3BsYXlPYmplY3RDb250YWluZXIoKTtcbnViZXJDb250YWluZXIucG9zaXRpb24ueCA9IE1hdGguZmxvb3Ioc2NlbmVXaWR0aCo5LzEwKTtcbnViZXJDb250YWluZXIucG9zaXRpb24ueSA9IDA7XG5zdGFnZS5hZGRDaGlsZCh1YmVyQ29udGFpbmVyKTtcblxudmFyIFBpYW5vUm9sbCA9IHJlcXVpcmUoJy4vcGlhbm9yb2xsLmpzJylcblxuLy8gSW5pdCBjb250YWluZXJzXG52YXIgY29udGFpbmVyTGlzdCA9IFtdO1xuY29udGFpbmVyTGlzdC5wdXNoKG5ldyBQaWFub1JvbGwodWJlckNvbnRhaW5lciwgMCwgMCwgcHJIZWlnaHQxLCB0cnVlLCBwaXhlbHNQZXJTZWNvbmQxLCBzY2VuZVdpZHRoLCBub3RlQ29sb3JzLCBjb2xvcnNSZWcsIGxpbmVDb2xvciwgbGluZUludGVydmFsLCBvZmZzZXRNdXNpYywgcHJIZWlnaHQxIC8gMTI4KSk7XG5jb250YWluZXJMaXN0LnB1c2gobmV3IFBpYW5vUm9sbCh1YmVyQ29udGFpbmVyLCAwLCBwckhlaWdodDEsIHBySGVpZ2h0MiwgZmFsc2UsIHBpeGVsc1BlclNlY29uZDIsIHNjZW5lV2lkdGgsIG5vdGVDb2xvcnMsIGNvbG9yc1JlZywgbGluZUNvbG9yLCBsaW5lSW50ZXJ2YWwsIG9mZnNldE11c2ljLCBwckhlaWdodDIgLyAxMjgpKTtcblxuLy8gTGluZSBiZXR3ZWVuIHR3byBjb250YWluZXJzXG52YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpO1xuZ3JhcGhpY3MuYmVnaW5GaWxsKDB4RkZGRjAwKTtcbmdyYXBoaWNzLmxpbmVTdHlsZSgxLCBsaW5lQ29sb3IpO1xuZ3JhcGhpY3MubW92ZVRvKDAsIHBySGVpZ2h0MSk7XG5ncmFwaGljcy5saW5lVG8oc2NlbmVXaWR0aCwgcHJIZWlnaHQxKTtcbmdyYXBoaWNzLmVuZEZpbGwoKTtcbnN0YWdlLmFkZENoaWxkKGdyYXBoaWNzKTtcblxuXG5mdW5jdGlvbiByZXBsYWNlQ29udGFpbmVycygpe1xuICAgIHZhciBkaWZmID0gKERhdGUubm93KCkgLSB0aW1lUGFnZUxvYWRlZCkvMTAwMDsvLyBuYiBvZiBzZWNvbmRzIHNpbmNlIHBhZ2UgbG9hZGVkXG4gICAgLy9jb25zb2xlLmxvZyhcInJlcGxhY2UgISBkaWZmMSA9IFwiLCBjb250YWluZXIxLnggLSBNYXRoLmZsb29yKC1kaWZmKnBpeGVsc1BlclNlY29uZDEpLCBcIiwgZGlmZiAyID0gXCIsIGNvbnRhaW5lcjIueCAtIE1hdGguZmxvb3IoLWRpZmYqcGl4ZWxzUGVyU2Vjb25kMikpO1xuICAgIGZvcih2YXIgaT0wO2k8Y29udGFpbmVyTGlzdC5sZW5ndGg7aSsrKXtcbiAgICAgICAgY29udGFpbmVyTGlzdFtpXS5tb3ZlVG8oLWRpZmYpO1xuICAgIH1cbiAgICByZW5kZXJlci5yZW5kZXIoc3RhZ2UpO1xufVxuXG5mdW5jdGlvbiBhZGROb3RlcyhkYXRhKXtcbiAgICBpZighb2Zmc2V0TXVzaWMpe1xuICAgICAgICAvLyBnZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IG5vdGUgdGltZWNvZGUgYW5kIG15IHplcm8gdG8gc2V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNhbnZhcydzIHplcm8gYW5kIHRoZSBtdXNpYydzIHplcm9cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gcGxhY2UgaW4gcmVhbCB0aW1lXG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgdGltZUJldHdlZW5Ob3dBbmRTdGFydCA9IG5vdyAtIHRpbWVQYWdlTG9hZGVkO1xuICAgICAgICBvZmZzZXRNdXNpYyA9IHRpbWVCZXR3ZWVuTm93QW5kU3RhcnQgLSBkYXRhLmNvbnRlbnRbMV07XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJzdGFydDogXCIsIHRpbWVQYWdlTG9hZGVkLCBcIiwgbm93OiBcIiwgbm93LCBcIiwgdGltZUJldHdlZW5Ob3dBbmRTdGFydCA9IFwiLCB0aW1lQmV0d2Vlbk5vd0FuZFN0YXJ0LCBcIiwgb2Zmc2V0TXVzaWMgPSBcIiwgb2Zmc2V0TXVzaWMpO1xuICAgIH1cbiAgICB2YXIgbm90ZSA9IGRhdGEuY29udGVudFszXTtcbiAgICB2YXIgdmVsb2NpdHkgPSBkYXRhLmNvbnRlbnRbNF07XG4gICAgaWYodmVsb2NpdHk9PT0wKXtcbiAgICAgICAgaWYodHlwZW9mIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0hPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAvLyBXZSBjbG9zZSB0aGUgbm90ZSBpbiBjb250YWluZXIgb25lXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiY291Y291IDJcIiwgZGF0YSk7XG4gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBkYXRhLmNvbnRlbnRbMV0gLSBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdLnRzO1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxjb250YWluZXJMaXN0Lmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgYWRkTm90ZShub3RlLCBzdGFydFRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgdmVsb2NpdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuYWwpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTGlzdFtpXS5hZGROb3RlKG5vdGUsIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0udHMsIGR1cmF0aW9uLCBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdLnZlbG9jaXR5LCBkYXRhLmNvbnRlbnRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVsZXRlIGVudHJ5XG4gICAgICAgICAgICBkZWxldGUgbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXVtub3RlXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgICBpZih0eXBlb2Ygbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXT09PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdID0ge3RzOiBkYXRhLmNvbnRlbnRbMV0sIHZlbG9jaXR5OnZlbG9jaXR5fTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZExpbmUoKXtcbiAgICBuYkxpbmVzKys7XG4gICAgZm9yKHZhciBpPTA7aTxjb250YWluZXJMaXN0Lmxlbmd0aDtpKyspe1xuICAgICAgICBjb250YWluZXJMaXN0W2ldLmFkZExpbmUobmJMaW5lcyk7XG4gICAgfVxufVxuXG5cblxuLy8gU29ja2V0IG1hbmFnZW1lbnRcbnZhciBzb2NrID0gbnVsbDtcbnZhciBlbGxvZyA9IG51bGw7XG5mdW5jdGlvbiBsb2cobSkge1xuICAgIGlmKGxvZ2dlcil7XG4gICAgICAgIGVsbG9nLmlubmVySFRNTCArPSBtICsgJ1xcbic7XG4gICAgICAgIGVsbG9nLnNjcm9sbFRvcCA9IGVsbG9nLnNjcm9sbEhlaWdodDtcbiAgICB9XG59XG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKXtcblxuICAgIGlmKGxvZ2dlcil7XG4gICAgICAgIGVsbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZycpO1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKSk7XG4gICAgfVxuXG4gICAgdmFyIHdzdXJpO1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdmaWxlOicpIHtcbiAgICAgICAgd3N1cmkgPSAnd3M6Ly8xMjcuMC4wLjE6ODA5MC9icm9hZGNhc3QnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdzdXJpID0gJ3dzOi8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6ODA5MC9icm9hZGNhc3QnO1xuICAgIH1cbiAgICB3c3VyaSA9IHdzdXJpICsgJz9jaGFubmVsPVBJQU5PUk9MTCZldmVudF9jb2RlPScrZXZlbnRDb2RlO1xuXG4gICAgaWYgKCdXZWJTb2NrZXQnIGluIHdpbmRvdykge1xuICAgICAgICBzb2NrID0gbmV3IFdlYlNvY2tldCh3c3VyaSk7XG4gICAgfSBlbHNlIGlmICgnTW96V2ViU29ja2V0JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgc29jayA9IG5ldyBNb3pXZWJTb2NrZXQod3N1cmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYlNvY2tldCEnKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJ2h0dHA6Ly9hdXRvYmFobi53cy91bnN1cHBvcnRlZGJyb3dzZXInO1xuICAgIH1cblxuICAgIGlmIChzb2NrKSB7XG4gICAgICAgIHNvY2sub25vcGVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKGxvZ2dlcil7XG4gICAgICAgICAgICAgICAgbG9nKCdDb25uZWN0ZWQgdG8gJyArIHdzdXJpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzb2NrLm9uY2xvc2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZihsb2dnZXIpe1xuICAgICAgICAgICAgICAgIGxvZygnQ29ubmVjdGlvbiBjbG9zZWQgKHdhc0NsZWFuID0gJyArIGUud2FzQ2xlYW4gKyAnLCBjb2RlID0gJyArIGUuY29kZSArICcsIHJlYXNvbiA9IFxcJycgKyBlLnJlYXNvbiArICdcXCcpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb2NrID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICBzb2NrLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmKGxvZ2dlcil7XG4gICAgICAgICAgICAgICAgbG9nKCdHb3QgbWVzc2FnZTogJyArIGUuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGROb3RlcyhKU09OLnBhcnNlKGUuZGF0YSkpO1xuICAgICAgICB9O1xuICAgIH1cbn07XG5cblxuLy8gSW5pdCBwYWdlIGFuZCBpbnRlcnZhbHNcbmFkZExpbmUoKTtcbnZhciBtb3ZlSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwocmVwbGFjZUNvbnRhaW5lcnMsIDEwMDAvbWFudWFsRnJhbWVyYXRlKTtcbnZhciB2ZXJ0aWNhbExpbmVzSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoYWRkTGluZSwgbGluZUludGVydmFsKTtcblxuLy8gTGl0dGxlIGludGV2YWwgdG8gc2hvdyB0aW1lXG52YXIgbmJTZWMgPSAwO1xudmFyIG15U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteXNwYW4nKTtcbmZ1bmN0aW9uIHVwZGF0ZVRpbWUoKXtcbiAgICBuYlNlYysrO1xuICAgIHZhciBob3VycyA9IHBhcnNlSW50KCBuYlNlYyAvIDM2MDAgKSAlIDI0O1xuICAgIHZhciBtaW51dGVzID0gcGFyc2VJbnQoIG5iU2VjIC8gNjAgKSAlIDYwO1xuICAgIHZhciBzZWNvbmRzID0gbmJTZWMgJSA2MDtcbiAgICB2YXIgdGltZVN0ciA9IChob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycykgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcyk7XG4gICAgbXlTcGFuLmlubmVySFRNTCA9IHRpbWVTdHI7XG59XG52YXIgc2Vjb25kSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodXBkYXRlVGltZSwgMTAwMCk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1vdmVJbnRlcnZhbDogbW92ZUludGVydmFsLFxuICAgIHZlcnRpY2FsTGluZXNJbnRlcnZhbDogdmVydGljYWxMaW5lc0ludGVydmFsLFxuICAgIHNlY29uZEludGVydmFsOiBzZWNvbmRJbnRlcnZhbFxufTtcbiIsIi8qKlxuKiBqcy9waWFub3JvbGwuanNcbipcbiogcGlhbm9yb2xsIGJhc2ljIGNvbXBvbmVudFxuKlxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciByYW5kb21Db2xvciA9IHJlcXVpcmUoJ3JhbmRvbUNvbG9yJyk7XG5cbmZ1bmN0aW9uIFBpYW5vUm9sbChwYXJlbnRDb250YWluZXIsIHhJbml0LCB5SW5pdCwgaGVpZ2h0LCBsaW5lc0Rvd24sIHBpeGVsc1BlclNlY29uZCwgd2lkdGgsIG5vdGVDb2xvcnMsIGNvbG9yc1JlZywgbGluZUNvbG9yLCBsaW5lSW50ZXJ2YWwsIG9mZnNldE11c2ljLCBub3RlSGVpZ2h0KXtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xuICAgIHRoaXMuY29udGFpbmVyLnBvc2l0aW9uLnggPSB4SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci5wb3NpdGlvbi55ID0geUluaXQ7XG4gICAgcGFyZW50Q29udGFpbmVyLmFkZENoaWxkKHRoaXMuY29udGFpbmVyKTtcblxuICAgIHRoaXMubGluZXNEb3duID0gbGluZXNEb3duO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMucGl4ZWxzUGVyU2Vjb25kID0gcGl4ZWxzUGVyU2Vjb25kO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLm5vdGVDb2xvcnMgPSBub3RlQ29sb3JzO1xuICAgIHRoaXMuY29sb3JzUmVnID0gY29sb3JzUmVnIHx8IHt9O1xuICAgIHRoaXMubGluZUNvbG9yID0gbGluZUNvbG9yO1xuICAgIHRoaXMubGluZUludGVydmFsID0gbGluZUludGVydmFsO1xuICAgIHRoaXMub2Zmc2V0TXVzaWMgPSBvZmZzZXRNdXNpYyB8fCAwO1xuICAgIHRoaXMubm90ZUhlaWdodCA9IG5vdGVIZWlnaHQ7XG5cbiAgICB0aGlzLmFkZE5vdGUgPSBmdW5jdGlvbihub3RlLCBzdGFydFRpbWUsIGR1cmF0aW9uLCB2ZWxvY2l0eSwgY2FuYWwpe1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY291Y291IDFcIiwgbm90ZSwgdGltZUZyb21aZXJvLCB0cywgdmVsb2NpdHksIHBpeGVsc1BlclNlY29uZCwgY29udGFpbmVyLCBwckhlaWdodCk7XG4gICAgICAgIHZhciBiZWdpblggPSAodGhpcy5vZmZzZXRNdXNpYyArIHN0YXJ0VGltZSkgKiB0aGlzLnBpeGVsc1BlclNlY29uZCAvIDEwMDA7XG4gICAgICAgIHZhciB3aWR0aCA9IGR1cmF0aW9uICogdGhpcy5waXhlbHNQZXJTZWNvbmQgLyAxMDAwO1xuICAgICAgICBpZigoYmVnaW5YK3dpZHRoKSA8ICBNYXRoLmFicyh0aGlzLmNvbnRhaW5lci54KSAtIHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG5vdCB2aXNpYmxlLiBkbyBub3RoaW5nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZHJhdyB0aGUgcmVjdGFuZ2xlXG4gICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJiZWdpblggPSBcIiwgYmVnaW5YLCBcImNhbmFsID0gXCIsIGNhbmFsLCBcImNvbG9yID0gXCIsIG5vdGVDb2xvcltjYW5hbF0sIFwid2lkdGggPSBcIiwgd2lkdGgsIFwibm90ZSA9IFwiLCBub3RlLCBcInZlbG9jaXR5ID0gXCIsIHZlbG9jaXR5KTtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdO1xuICAgICAgICBpZih0eXBlb2YoY29sb3IpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFyIGNvbG9yc1JlZ1NpemUgPSBPYmplY3Qua2V5cyh0aGlzLmNvbG9yc1JlZykubGVuZ3RoO1xuICAgICAgICAgICAgaWYoY29sb3JzUmVnU2l6ZSA8IHRoaXMubm90ZUNvbG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzUmVnW2NhbmFsXSA9IHRoaXMubm90ZUNvbG9yc1tjb2xvcnNSZWdTaXplXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdID0gcGFyc2VJbnQocmFuZG9tQ29sb3IoeyBsdW1pbm9zaXR5OiAnbGlnaHQnLCBodWU6ICdyYW5kb20nLCBmb3JtYXQ6J2hleCd9KS5yZXBsYWNlKC9eIy8sICcnKSwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luRmlsbChjb2xvciwgKHZlbG9jaXR5IC8gMTI4KSk7XG4gICAgICAgIHZhciB5ID0gKDEyOC1ub3RlKSAqIHRoaXMuaGVpZ2h0IC8gMTI4OyAvLyAoMTI4LW5vdGUpIGJlY2F1c2UgeSA9IDAgaXMgZm9yIG5vdGUgPSAxMjggYW5kIHkgPSAxMjggZm9yIG5vdGUgPSAwXG4gICAgICAgIGdyYXBoaWNzLmRyYXdSZWN0KDAsIE1hdGguZmxvb3IoeSAtIChub3RlSGVpZ2h0LzIpICsgKCh0aGlzLmhlaWdodCAvIDEyOCkvMikpLCB3aWR0aCwgbm90ZUhlaWdodCk7XG4gICAgICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcbiAgICAgICAgZ3JhcGhpY3MueCA9IGJlZ2luWDtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZExpbmUgPSBmdW5jdGlvbihsaW5lTmIpe1xuICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpO1xuICAgICAgICB2YXIgeCA9IC10aGlzLmNvbnRhaW5lci54O1xuICAgICAgICBncmFwaGljcy5iZWdpbkZpbGwoMHhGRkZGMDApO1xuICAgICAgICBncmFwaGljcy5saW5lU3R5bGUoMSwgdGhpcy5saW5lQ29sb3IpO1xuICAgICAgICB2YXIgeSA9IHRoaXMubGluZXNEb3duID8gdGhpcy5oZWlnaHQgLSAyMCA6IDA7XG4gICAgICAgIGdyYXBoaWNzLm1vdmVUbyh4LCB5KTtcbiAgICAgICAgZ3JhcGhpY3MubGluZVRvKHgsIHkgKyAyMCk7XG4gICAgICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgICAgICAvLyBBZGQgdGV4dFxuICAgICAgICB2YXIgdG90YWxTZWMgPSBsaW5lTmIgKiB0aGlzLmxpbmVJbnRlcnZhbCAvIDEwMDA7XG4gICAgICAgIHZhciBob3VycyA9IHBhcnNlSW50KCB0b3RhbFNlYyAvIDM2MDAgKSAlIDI0O1xuICAgICAgICB2YXIgbWludXRlcyA9IHBhcnNlSW50KCB0b3RhbFNlYyAvIDYwICkgJSA2MDtcbiAgICAgICAgdmFyIHNlY29uZHMgPSB0b3RhbFNlYyAlIDYwO1xuICAgICAgICB2YXIgdGltZVN0ciA9IChob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycykgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcyk7XG4gICAgICAgIHZhciBmb250T2JqID0geyBmb250OiAnMTBwdCBBcmlhbCcsIGZpbGw6ICcjNDQ0NDQ0JyB9O1xuICAgICAgICB2YXIgdCA9IG5ldyBQSVhJLlRleHQodGltZVN0ciwgZm9udE9iaik7XG4gICAgICAgIHQueCA9IHggKyAyO1xuICAgICAgICB0LnkgPSB0aGlzLmxpbmVzRG93biA/IHRoaXMuaGVpZ2h0IC0gMTUgOiAyO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0KTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb3ZlVG8gPSBmdW5jdGlvbihkaWZmVGltZSl7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnggPSBNYXRoLmZsb29yKGRpZmZUaW1lKnRoaXMucGl4ZWxzUGVyU2Vjb25kKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZW1vdmVQYXNzZWRPYmpldHMgPSBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbmJDaGlsZHMgPSBfdGhpcy5jb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICB2YXIgaSA9IDAsIGNoaWxkSXNOb3dEaXNwbGF5ZWQgPSBmYWxzZSwgY2hpbGRyZW5Ub1JlbW92ZSA9IFtdO1xuICAgICAgICB3aGlsZShpPG5iQ2hpbGRzICYmICFjaGlsZElzTm93RGlzcGxheWVkKXtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbltpKytdO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlbW92ZSA/IFwiLCBjaGlsZC54LCBjaGlsZC53aWR0aCwgKChjaGlsZC54ICsgY2hpbGQud2lkdGgpIDwgKE1hdGguYWJzKF90aGlzLmNvbnRhaW5lci54KSAtIF90aGlzLndpZHRoKSkpO1xuICAgICAgICAgICAgaWYodHlwZW9mKGNoaWxkKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoKGNoaWxkLnggKyBjaGlsZC53aWR0aCkgPCAoTWF0aC5hYnMoX3RoaXMuY29udGFpbmVyLngpIC0gX3RoaXMud2lkdGgpKXtcbiAgICAgICAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIgICAgcmVtb3ZlICEhIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkSXNOb3dEaXNwbGF5ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIgICAgY2hpbGRJc05vd0Rpc3BsYXllZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgICAgIF90aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIDogXCIsIG5iQ2hpbGRzLCBcIiwgYWZ0ZXIgOiBcIiwgX3RoaXMuY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSBub3RlcyBlYWNoIHNjZW5lIHdpZHRoXG4gICAgLy92YXIgcmVtb3ZlSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiBzY2VuZVdpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcbiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiB0aGlzLndpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBpYW5vUm9sbDtcbiJdfQ== |