annot-server/static/js/pianoroll.js
author rougeronj
Fri, 23 Jan 2015 23:19:45 +0100
changeset 142 e424eed32f72
parent 86 e944c017b8c8
permissions -rw-r--r--
Add correct options to annotviz.html fo 3rd day and gulp dist server
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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==