author | ymh <ymh.work@gmail.com> |
Mon, 12 Jan 2015 17:23:05 +0100 | |
changeset 84 | d7c5bffdd2d8 |
child 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 = []; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
55 |
containerList.push(new PianoRoll(uberContainer, 0, 0, prHeight1, true, pixelsPerSecond1, sceneWidth, noteColors, colorsReg, lineColor, lineInterval)); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
56 |
containerList.push(new PianoRoll(uberContainer, 0, prHeight1, prHeight2, false, pixelsPerSecond2, sceneWidth, noteColors, colorsReg, lineColor, lineInterval)); |
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 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
214 |
function PianoRoll(parentContainer, xInit, yInit, height, linesDown, pixelsPerSecond, width, noteColors, colorsReg, lineColor, lineInterval){ |
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; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
229 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
230 |
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
|
231 |
//console.log("coucou 1", note, timeFromZero, ts, velocity, pixelsPerSecond, container, prHeight); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
232 |
var beginX = (offsetMusic + startTime) * this.pixelsPerSecond / 1000; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
233 |
var width = duration * this.pixelsPerSecond / 1000; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
234 |
// We draw the rectangle |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
235 |
var graphics = new PIXI.Graphics(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
236 |
//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
|
237 |
var color = this.colorsReg[canal]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
238 |
if(typeof(color) === 'undefined') { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
239 |
var colorsRegSize = Object.keys(this.colorsReg).length; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
240 |
if(colorsRegSize < this.noteColors.length) { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
241 |
color = this.colorsReg[canal] = this.noteColors[colorsRegSize]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
242 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
243 |
else { |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
244 |
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
|
245 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
246 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
247 |
graphics.beginFill(color, (velocity / 128)); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
248 |
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
|
249 |
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
|
250 |
graphics.endFill(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
251 |
graphics.x = beginX; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
252 |
this.container.addChild(graphics); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
253 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
254 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
255 |
this.addLine = function(lineNb){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
256 |
var graphics = new PIXI.Graphics(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
257 |
var x = -this.container.x; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
258 |
graphics.beginFill(0xFFFF00); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
259 |
graphics.lineStyle(1, this.lineColor); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
260 |
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
|
261 |
graphics.moveTo(x, y); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
262 |
graphics.lineTo(x, y + 20); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
263 |
graphics.endFill(); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
264 |
this.container.addChild(graphics); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
265 |
// Add text |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
266 |
var totalSec = lineNb * this.lineInterval / 1000; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
267 |
var hours = parseInt( totalSec / 3600 ) % 24; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
268 |
var minutes = parseInt( totalSec / 60 ) % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
269 |
var seconds = totalSec % 60; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
270 |
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
|
271 |
var fontObj = { font: '10pt Arial', fill: '#444444' }; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
272 |
var t = new PIXI.Text(timeStr, fontObj); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
273 |
t.x = x + 2; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
274 |
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
|
275 |
this.container.addChild(t); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
276 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
277 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
278 |
this.moveTo = function(diffTime){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
279 |
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
|
280 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
281 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
282 |
this.removePassedObjets = function(){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
283 |
var nbChilds = _this.container.children.length; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
284 |
var i = 0, childIsNowDisplayed = false; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
285 |
while(i<nbChilds && !childIsNowDisplayed){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
286 |
var child = _this.container.children[0]; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
287 |
//console.log("remove ? ", child.x, child.width, ((child.x + child.width) < (Math.abs(_this.container.x) - _this.width))); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
288 |
if((child.x + child.width) < (Math.abs(_this.container.x) - _this.width)){ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
289 |
_this.container.removeChild(child); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
290 |
//console.log(" remove !!!"); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
291 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
292 |
else{ |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
293 |
childIsNowDisplayed = true; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
294 |
//console.log(" childIsNowDisplayed"); |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
295 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
296 |
i++; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
297 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
298 |
//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
|
299 |
}; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
300 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
301 |
// remove notes each scene width |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
302 |
//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
|
303 |
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
|
304 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
305 |
} |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
306 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
307 |
module.exports = PianoRoll; |
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
308 |
|
d7c5bffdd2d8
rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
309 |
},{"pixi":"pixi","randomColor":"randomColor"}]},{},[1])(1) |
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 |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL2FwcC9qcy9tYWluLmpzIiwiL1VzZXJzL3ltaC9kZXYvcHJvamVjdHMvbW9ucy9kZXYvY2xpZW50L3BpYW5vcm9sbC9hcHAvanMvcGlhbm9yb2xsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoqXG4gKiBzY3JpcHRzL21haW4uanNcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAqIFRha2UgYSBsb29rIGF0IGh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8gZm9yIG1vcmUgaW5mb1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcblxuLy8gQ29uZmlnIHZhcnNcbnZhciBsb2dnZXIgPSBmYWxzZTtcbnZhciBzY2VuZVdpZHRoID0gMTkyMDtcbnZhciBwckhlaWdodDEgPSA0MzU7XG52YXIgcHJIZWlnaHQyID0gNjQ1O1xudmFyIHNjZW5lSGVpZ2h0ID0gcHJIZWlnaHQxICsgcHJIZWlnaHQyO1xudmFyIHNjZW5lQmdDb2xvciA9IDB4RkZGRkZGO1xudmFyIGxpbmVDb2xvciA9IDB4NDQ0NDQ0O1xudmFyIHBpeGVsc1BlclNlY29uZDEgPSBNYXRoLmZsb29yKHNjZW5lV2lkdGggLyAxMCk7IC8vIG5iIG9mIHBpeGVscyBwZXIgc2Vjb25kXG52YXIgbWFudWFsRnJhbWVyYXRlID0gcGl4ZWxzUGVyU2Vjb25kMSAvIDQ7XG52YXIgcGl4ZWxzUGVyU2Vjb25kMiA9IE1hdGguZmxvb3Ioc2NlbmVXaWR0aCAvIDYwKTsgLy8gbmIgb2YgcGl4ZWxzIHBlciBzZWNvbmRcbnZhciBsaW5lSW50ZXJ2YWwgPSA1MDAwOyAvLyBtZWFucyBsaW5lIGV2ZXJ5IDUgc2Vjb25kc1xudmFyIG5iTGluZXMgPSAtMTtcbnZhciBub3RlSGVpZ2h0ID0gMTEwO1xudmFyIG5vdGVDb2xvcnMgPSBbMHhCOTAwMDAsIDB4NEJERDcxLCAweEFGOTMxRSwgMHgxQzI4QkEsIDB4NTM2OTkxXTtcbnZhciBjb2xvcnNSZWcgPSB7fTtcbi8vIFZhcnNcbnZhciBub3RlRGljdCA9IFtdO1xuLy8gVGltZWNvZGUgbWV0aG9kXG52YXIgdGltZVBhZ2VMb2FkZWQgPSBEYXRlLm5vdygpO1xudmFyIG9mZnNldE11c2ljID0gZmFsc2U7XG5cblxuLy9jcmVhdGUgYW4gbmV3IGluc3RhbmNlIG9mIGEgcGl4aSBzdGFnZVxudmFyIHN0YWdlID0gbmV3IFBJWEkuU3RhZ2Uoc2NlbmVCZ0NvbG9yKTtcblxuLy9jcmVhdGUgYSByZW5kZXJlciBpbnN0YW5jZS5cbnZhciByZW5kZXJlciA9IFBJWEkuYXV0b0RldGVjdFJlbmRlcmVyKHNjZW5lV2lkdGgsIHNjZW5lSGVpZ2h0KTtcblxuLy9hZGQgdGhlIHJlbmRlcmVyIHZpZXcgZWxlbWVudCB0byB0aGUgRE9NXG5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzQ29udGFpbmVyJykuYXBwZW5kQ2hpbGQocmVuZGVyZXIudmlldyk7XG5cbnZhciB1YmVyQ29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xudWJlckNvbnRhaW5lci5wb3NpdGlvbi54ID0gTWF0aC5mbG9vcihzY2VuZVdpZHRoKjkvMTApO1xudWJlckNvbnRhaW5lci5wb3NpdGlvbi55ID0gMDtcbnN0YWdlLmFkZENoaWxkKHViZXJDb250YWluZXIpO1xuXG52YXIgUGlhbm9Sb2xsID0gcmVxdWlyZSgnLi9waWFub3JvbGwuanMnKVxuXG4vLyBJbml0IGNvbnRhaW5lcnNcbnZhciBjb250YWluZXJMaXN0ID0gW107XG5jb250YWluZXJMaXN0LnB1c2gobmV3IFBpYW5vUm9sbCh1YmVyQ29udGFpbmVyLCAwLCAwLCBwckhlaWdodDEsIHRydWUsIHBpeGVsc1BlclNlY29uZDEsIHNjZW5lV2lkdGgsIG5vdGVDb2xvcnMsIGNvbG9yc1JlZywgbGluZUNvbG9yLCBsaW5lSW50ZXJ2YWwpKTtcbmNvbnRhaW5lckxpc3QucHVzaChuZXcgUGlhbm9Sb2xsKHViZXJDb250YWluZXIsIDAsIHBySGVpZ2h0MSwgcHJIZWlnaHQyLCBmYWxzZSwgcGl4ZWxzUGVyU2Vjb25kMiwgc2NlbmVXaWR0aCwgbm90ZUNvbG9ycywgY29sb3JzUmVnLCBsaW5lQ29sb3IsIGxpbmVJbnRlcnZhbCkpO1xuXG4vLyBMaW5lIGJldHdlZW4gdHdvIGNvbnRhaW5lcnNcbnZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XG5ncmFwaGljcy5iZWdpbkZpbGwoMHhGRkZGMDApO1xuZ3JhcGhpY3MubGluZVN0eWxlKDEsIGxpbmVDb2xvcik7XG5ncmFwaGljcy5tb3ZlVG8oMCwgcHJIZWlnaHQxKTtcbmdyYXBoaWNzLmxpbmVUbyhzY2VuZVdpZHRoLCBwckhlaWdodDEpO1xuZ3JhcGhpY3MuZW5kRmlsbCgpO1xuc3RhZ2UuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuXG5cbmZ1bmN0aW9uIHJlcGxhY2VDb250YWluZXJzKCl7XG4gICAgdmFyIGRpZmYgPSAoRGF0ZS5ub3coKSAtIHRpbWVQYWdlTG9hZGVkKS8xMDAwOy8vIG5iIG9mIHNlY29uZHMgc2luY2UgcGFnZSBsb2FkZWRcbiAgICAvL2NvbnNvbGUubG9nKFwicmVwbGFjZSAhIGRpZmYxID0gXCIsIGNvbnRhaW5lcjEueCAtIE1hdGguZmxvb3IoLWRpZmYqcGl4ZWxzUGVyU2Vjb25kMSksIFwiLCBkaWZmIDIgPSBcIiwgY29udGFpbmVyMi54IC0gTWF0aC5mbG9vcigtZGlmZipwaXhlbHNQZXJTZWNvbmQyKSk7XG4gICAgZm9yKHZhciBpPTA7aTxjb250YWluZXJMaXN0Lmxlbmd0aDtpKyspe1xuICAgICAgICBjb250YWluZXJMaXN0W2ldLm1vdmVUbygtZGlmZik7XG4gICAgfVxuICAgIHJlbmRlcmVyLnJlbmRlcihzdGFnZSk7XG59XG5cbmZ1bmN0aW9uIGFkZE5vdGVzKGRhdGEpe1xuICAgIGlmKCFvZmZzZXRNdXNpYyl7XG4gICAgICAgIC8vIGdldCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgbm90ZSB0aW1lY29kZSBhbmQgbXkgemVybyB0byBzZXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FudmFzJ3MgemVybyBhbmQgdGhlIG11c2ljJ3MgemVyb1xuICAgICAgICAvLyBpbiBvcmRlciB0byBwbGFjZSBpbiByZWFsIHRpbWVcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciB0aW1lQmV0d2Vlbk5vd0FuZFN0YXJ0ID0gbm93IC0gdGltZVBhZ2VMb2FkZWQ7XG4gICAgICAgIG9mZnNldE11c2ljID0gdGltZUJldHdlZW5Ob3dBbmRTdGFydCAtIGRhdGEuY29udGVudFsxXTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInN0YXJ0OiBcIiwgdGltZVBhZ2VMb2FkZWQsIFwiLCBub3c6IFwiLCBub3csIFwiLCB0aW1lQmV0d2Vlbk5vd0FuZFN0YXJ0ID0gXCIsIHRpbWVCZXR3ZWVuTm93QW5kU3RhcnQsIFwiLCBvZmZzZXRNdXNpYyA9IFwiLCBvZmZzZXRNdXNpYyk7XG4gICAgfVxuICAgIHZhciBub3RlID0gZGF0YS5jb250ZW50WzNdO1xuICAgIHZhciB2ZWxvY2l0eSA9IGRhdGEuY29udGVudFs0XTtcbiAgICBpZih2ZWxvY2l0eT09PTApe1xuICAgICAgICBpZih0eXBlb2Ygbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXVtub3RlXSE9PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIC8vIFdlIGNsb3NlIHRoZSBub3RlIGluIGNvbnRhaW5lciBvbmVcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJjb3Vjb3UgMlwiLCBkYXRhKTtcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IGRhdGEuY29udGVudFsxXSAtIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0udHM7XG4gICAgICAgICAgICBmb3IodmFyIGk9MDtpPGNvbnRhaW5lckxpc3QubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBhZGROb3RlKG5vdGUsIHN0YXJ0VGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCB2ZWxvY2l0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5hbClcbiAgICAgICAgICAgICAgICBjb250YWluZXJMaXN0W2ldLmFkZE5vdGUobm90ZSwgbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXVtub3RlXS50cywgZHVyYXRpb24sIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0udmVsb2NpdHksIGRhdGEuY29udGVudFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkZWxldGUgZW50cnlcbiAgICAgICAgICAgIGRlbGV0ZSBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICAgIGlmKHR5cGVvZiBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dPT09J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0gPSB7dHM6IGRhdGEuY29udGVudFsxXSwgdmVsb2NpdHk6dmVsb2NpdHl9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZSgpe1xuICAgIG5iTGluZXMrKztcbiAgICBmb3IodmFyIGk9MDtpPGNvbnRhaW5lckxpc3QubGVuZ3RoO2krKyl7XG4gICAgICAgIGNvbnRhaW5lckxpc3RbaV0uYWRkTGluZShuYkxpbmVzKTtcbiAgICB9XG59XG5cblxuXG4vLyBTb2NrZXQgbWFuYWdlbWVudFxudmFyIHNvY2sgPSBudWxsO1xudmFyIGVsbG9nID0gbnVsbDtcbmZ1bmN0aW9uIGxvZyhtKSB7XG4gICAgaWYobG9nZ2VyKXtcbiAgICAgICAgZWxsb2cuaW5uZXJIVE1MICs9IG0gKyAnXFxuJztcbiAgICAgICAgZWxsb2cuc2Nyb2xsVG9wID0gZWxsb2cuc2Nyb2xsSGVpZ2h0O1xuICAgIH1cbn1cbndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpe1xuXG4gICAgaWYobG9nZ2VyKXtcbiAgICAgICAgZWxsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJyk7XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZycpKTtcbiAgICB9XG5cbiAgICB2YXIgd3N1cmk7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2ZpbGU6Jykge1xuICAgICAgICB3c3VyaSA9ICd3czovLzEyNy4wLjAuMTo4MDkwL2Jyb2FkY2FzdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd3N1cmkgPSAnd3M6Ly8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgJzo4MDkwL2Jyb2FkY2FzdCc7XG4gICAgfVxuICAgIHdzdXJpID0gd3N1cmkgKyAnP2NoYW5uZWw9UElBTk9ST0xMJmV2ZW50X2NvZGU9JytldmVudENvZGU7XG5cbiAgICBpZiAoJ1dlYlNvY2tldCcgaW4gd2luZG93KSB7XG4gICAgICAgIHNvY2sgPSBuZXcgV2ViU29ja2V0KHdzdXJpKTtcbiAgICB9IGVsc2UgaWYgKCdNb3pXZWJTb2NrZXQnIGluIHdpbmRvdykge1xuICAgICAgICBzb2NrID0gbmV3IE1veldlYlNvY2tldCh3c3VyaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViU29ja2V0IScpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAnaHR0cDovL2F1dG9iYWhuLndzL3Vuc3VwcG9ydGVkYnJvd3Nlcic7XG4gICAgfVxuXG4gICAgaWYgKHNvY2spIHtcbiAgICAgICAgc29jay5vbm9wZW4gPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYobG9nZ2VyKXtcbiAgICAgICAgICAgICAgICBsb2coJ0Nvbm5lY3RlZCB0byAnICsgd3N1cmkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNvY2sub25jbG9zZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmKGxvZ2dlcil7XG4gICAgICAgICAgICAgICAgbG9nKCdDb25uZWN0aW9uIGNsb3NlZCAod2FzQ2xlYW4gPSAnICsgZS53YXNDbGVhbiArICcsIGNvZGUgPSAnICsgZS5jb2RlICsgJywgcmVhc29uID0gXFwnJyArIGUucmVhc29uICsgJ1xcJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvY2sgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNvY2sub25tZXNzYWdlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYobG9nZ2VyKXtcbiAgICAgICAgICAgICAgICBsb2coJ0dvdCBtZXNzYWdlOiAnICsgZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE5vdGVzKEpTT04ucGFyc2UoZS5kYXRhKSk7XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuXG4vLyBJbml0IHBhZ2UgYW5kIGludGVydmFsc1xuYWRkTGluZSgpO1xudmFyIG1vdmVJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChyZXBsYWNlQ29udGFpbmVycywgMTAwMC9tYW51YWxGcmFtZXJhdGUpO1xudmFyIHZlcnRpY2FsTGluZXNJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChhZGRMaW5lLCBsaW5lSW50ZXJ2YWwpO1xuXG4vLyBMaXR0bGUgaW50ZXZhbCB0byBzaG93IHRpbWVcbnZhciBuYlNlYyA9IDA7XG52YXIgbXlTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215c3BhbicpO1xuZnVuY3Rpb24gdXBkYXRlVGltZSgpe1xuICAgIG5iU2VjKys7XG4gICAgdmFyIGhvdXJzID0gcGFyc2VJbnQoIG5iU2VjIC8gMzYwMCApICUgMjQ7XG4gICAgdmFyIG1pbnV0ZXMgPSBwYXJzZUludCggbmJTZWMgLyA2MCApICUgNjA7XG4gICAgdmFyIHNlY29uZHMgPSBuYlNlYyAlIDYwO1xuICAgIHZhciB0aW1lU3RyID0gKGhvdXJzIDwgMTAgPyAnMCcgKyBob3VycyA6IGhvdXJzKSArICc6JyArIChtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcykgKyAnOicgKyAoc2Vjb25kcyAgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzKTtcbiAgICBteVNwYW4uaW5uZXJIVE1MID0gdGltZVN0cjtcbn1cbnZhciBzZWNvbmRJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbCh1cGRhdGVUaW1lLCAxMDAwKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbW92ZUludGVydmFsOiBtb3ZlSW50ZXJ2YWwsXG4gICAgdmVydGljYWxMaW5lc0ludGVydmFsOiB2ZXJ0aWNhbExpbmVzSW50ZXJ2YWwsXG4gICAgc2Vjb25kSW50ZXJ2YWw6IHNlY29uZEludGVydmFsXG59O1xuIiwiLyoqXG4qIGpzL3BpYW5vcm9sbC5qc1xuKlxuKiBwaWFub3JvbGwgYmFzaWMgY29tcG9uZW50XG4qXG4qL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQSVhJID0gcmVxdWlyZSgncGl4aScpO1xudmFyIHJhbmRvbUNvbG9yID0gcmVxdWlyZSgncmFuZG9tQ29sb3InKTtcblxuZnVuY3Rpb24gUGlhbm9Sb2xsKHBhcmVudENvbnRhaW5lciwgeEluaXQsIHlJbml0LCBoZWlnaHQsIGxpbmVzRG93biwgcGl4ZWxzUGVyU2Vjb25kLCB3aWR0aCwgbm90ZUNvbG9ycywgY29sb3JzUmVnLCBsaW5lQ29sb3IsIGxpbmVJbnRlcnZhbCl7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBQSVhJLkRpc3BsYXlPYmplY3RDb250YWluZXIoKTtcbiAgICB0aGlzLmNvbnRhaW5lci5wb3NpdGlvbi54ID0geEluaXQ7XG4gICAgdGhpcy5jb250YWluZXIucG9zaXRpb24ueSA9IHlJbml0O1xuICAgIHBhcmVudENvbnRhaW5lci5hZGRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICB0aGlzLmxpbmVzRG93biA9IGxpbmVzRG93bjtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnBpeGVsc1BlclNlY29uZCA9IHBpeGVsc1BlclNlY29uZDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5ub3RlQ29sb3JzID0gbm90ZUNvbG9ycztcbiAgICB0aGlzLmNvbG9yc1JlZyA9IGNvbG9yc1JlZyB8fCB7fTtcbiAgICB0aGlzLmxpbmVDb2xvciA9IGxpbmVDb2xvcjtcbiAgICB0aGlzLmxpbmVJbnRlcnZhbCA9IGxpbmVJbnRlcnZhbDtcblxuICAgIHRoaXMuYWRkTm90ZSA9IGZ1bmN0aW9uKG5vdGUsIHN0YXJ0VGltZSwgZHVyYXRpb24sIHZlbG9jaXR5LCBjYW5hbCl7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJjb3Vjb3UgMVwiLCBub3RlLCB0aW1lRnJvbVplcm8sIHRzLCB2ZWxvY2l0eSwgcGl4ZWxzUGVyU2Vjb25kLCBjb250YWluZXIsIHBySGVpZ2h0KTtcbiAgICAgICAgdmFyIGJlZ2luWCA9IChvZmZzZXRNdXNpYyArIHN0YXJ0VGltZSkgKiB0aGlzLnBpeGVsc1BlclNlY29uZCAvIDEwMDA7XG4gICAgICAgIHZhciB3aWR0aCA9IGR1cmF0aW9uICogdGhpcy5waXhlbHNQZXJTZWNvbmQgLyAxMDAwO1xuICAgICAgICAvLyBXZSBkcmF3IHRoZSByZWN0YW5nbGVcbiAgICAgICAgdmFyIGdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImJlZ2luWCA9IFwiLCBiZWdpblgsIFwiY2FuYWwgPSBcIiwgY2FuYWwsIFwiY29sb3IgPSBcIiwgbm90ZUNvbG9yW2NhbmFsXSwgXCJ3aWR0aCA9IFwiLCB3aWR0aCwgXCJub3RlID0gXCIsIG5vdGUsIFwidmVsb2NpdHkgPSBcIiwgdmVsb2NpdHkpO1xuICAgICAgICB2YXIgY29sb3IgPSB0aGlzLmNvbG9yc1JlZ1tjYW5hbF07XG4gICAgICAgIGlmKHR5cGVvZihjb2xvcikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB2YXIgY29sb3JzUmVnU2l6ZSA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3JzUmVnKS5sZW5ndGg7XG4gICAgICAgICAgICBpZihjb2xvcnNSZWdTaXplIDwgdGhpcy5ub3RlQ29sb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdID0gdGhpcy5ub3RlQ29sb3JzW2NvbG9yc1JlZ1NpemVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNvbG9yc1JlZ1tjYW5hbF0gPSBwYXJzZUludChyYW5kb21Db2xvcih7IGx1bWlub3NpdHk6ICdsaWdodCcsIGh1ZTogJ3JhbmRvbScsIGZvcm1hdDonaGV4J30pLnJlcGxhY2UoL14jLywgJycpLCAxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5GaWxsKGNvbG9yLCAodmVsb2NpdHkgLyAxMjgpKTtcbiAgICAgICAgdmFyIHkgPSAoMTI4LW5vdGUpICogdGhpcy5oZWlnaHQgLyAxMjg7IC8vICgxMjgtbm90ZSkgYmVjYXVzZSB5ID0gMCBpcyBmb3Igbm90ZSA9IDEyOCBhbmQgeSA9IDEyOCBmb3Igbm90ZSA9IDBcbiAgICAgICAgZ3JhcGhpY3MuZHJhd1JlY3QoMCwgTWF0aC5mbG9vcih5IC0gKG5vdGVIZWlnaHQvMikgKyAoKHRoaXMuaGVpZ2h0IC8gMTI4KS8yKSksIHdpZHRoLCBub3RlSGVpZ2h0KTtcbiAgICAgICAgZ3JhcGhpY3MuZW5kRmlsbCgpO1xuICAgICAgICBncmFwaGljcy54ID0gYmVnaW5YO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChncmFwaGljcyk7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkTGluZSA9IGZ1bmN0aW9uKGxpbmVOYil7XG4gICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XG4gICAgICAgIHZhciB4ID0gLXRoaXMuY29udGFpbmVyLng7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luRmlsbCgweEZGRkYwMCk7XG4gICAgICAgIGdyYXBoaWNzLmxpbmVTdHlsZSgxLCB0aGlzLmxpbmVDb2xvcik7XG4gICAgICAgIHZhciB5ID0gdGhpcy5saW5lc0Rvd24gPyB0aGlzLmhlaWdodCAtIDIwIDogMDtcbiAgICAgICAgZ3JhcGhpY3MubW92ZVRvKHgsIHkpO1xuICAgICAgICBncmFwaGljcy5saW5lVG8oeCwgeSArIDIwKTtcbiAgICAgICAgZ3JhcGhpY3MuZW5kRmlsbCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChncmFwaGljcyk7XG4gICAgICAgIC8vIEFkZCB0ZXh0XG4gICAgICAgIHZhciB0b3RhbFNlYyA9IGxpbmVOYiAqIHRoaXMubGluZUludGVydmFsIC8gMTAwMDtcbiAgICAgICAgdmFyIGhvdXJzID0gcGFyc2VJbnQoIHRvdGFsU2VjIC8gMzYwMCApICUgMjQ7XG4gICAgICAgIHZhciBtaW51dGVzID0gcGFyc2VJbnQoIHRvdGFsU2VjIC8gNjAgKSAlIDYwO1xuICAgICAgICB2YXIgc2Vjb25kcyA9IHRvdGFsU2VjICUgNjA7XG4gICAgICAgIHZhciB0aW1lU3RyID0gKGhvdXJzIDwgMTAgPyAnMCcgKyBob3VycyA6IGhvdXJzKSArICc6JyArIChtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcykgKyAnOicgKyAoc2Vjb25kcyAgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzKTtcbiAgICAgICAgdmFyIGZvbnRPYmogPSB7IGZvbnQ6ICcxMHB0IEFyaWFsJywgZmlsbDogJyM0NDQ0NDQnIH07XG4gICAgICAgIHZhciB0ID0gbmV3IFBJWEkuVGV4dCh0aW1lU3RyLCBmb250T2JqKTtcbiAgICAgICAgdC54ID0geCArIDI7XG4gICAgICAgIHQueSA9IHRoaXMubGluZXNEb3duID8gdGhpcy5oZWlnaHQgLSAxNSA6IDI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKHQpO1xuICAgIH07XG5cbiAgICB0aGlzLm1vdmVUbyA9IGZ1bmN0aW9uKGRpZmZUaW1lKXtcbiAgICAgICAgdGhpcy5jb250YWluZXIueCA9IE1hdGguZmxvb3IoZGlmZlRpbWUqdGhpcy5waXhlbHNQZXJTZWNvbmQpO1xuICAgIH07XG5cbiAgICB0aGlzLnJlbW92ZVBhc3NlZE9iamV0cyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBuYkNoaWxkcyA9IF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIHZhciBpID0gMCwgY2hpbGRJc05vd0Rpc3BsYXllZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZShpPG5iQ2hpbGRzICYmICFjaGlsZElzTm93RGlzcGxheWVkKXtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF90aGlzLmNvbnRhaW5lci5jaGlsZHJlblswXTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJyZW1vdmUgPyBcIiwgY2hpbGQueCwgY2hpbGQud2lkdGgsICgoY2hpbGQueCArIGNoaWxkLndpZHRoKSA8IChNYXRoLmFicyhfdGhpcy5jb250YWluZXIueCkgLSBfdGhpcy53aWR0aCkpKTtcbiAgICAgICAgICAgIGlmKChjaGlsZC54ICsgY2hpbGQud2lkdGgpIDwgKE1hdGguYWJzKF90aGlzLmNvbnRhaW5lci54KSAtIF90aGlzLndpZHRoKSl7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiICAgIHJlbW92ZSAhISFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGNoaWxkSXNOb3dEaXNwbGF5ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIgICAgY2hpbGRJc05vd0Rpc3BsYXllZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIDogXCIsIG5iQ2hpbGRzLCBcIiwgYWZ0ZXIgOiBcIiwgX3RoaXMuY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSBub3RlcyBlYWNoIHNjZW5lIHdpZHRoXG4gICAgLy92YXIgcmVtb3ZlSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiBzY2VuZVdpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcbiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiB0aGlzLndpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBpYW5vUm9sbDtcbiJdfQ== |