Whiteboard A whiteboard implementation 0.2 whiteboard.html
]]>
wz_jsgraphics.js LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLg0K DQp3el9qc2dyYXBoaWNzLmpzICAgIHYuIDIuMzMNClRoZSBsYXRlc3QgdmVyc2lv biBpcyBhdmFpbGFibGUgYXQNCmh0dHA6Ly93d3cud2FsdGVyem9ybi5jb20NCm9y IGh0dHA6Ly93d3cuZGV2aXJhLmNvbQ0Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3Ju LmRlDQoNCkNvcHlyaWdodCAoYykgMjAwMi0yMDA0IFdhbHRlciBab3JuLiBBbGwg cmlnaHRzIHJlc2VydmVkLg0KQ3JlYXRlZCAzLiAxMS4gMjAwMiBieSBXYWx0ZXIg Wm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkNCkxhc3QgbW9k aWZpZWQ6IDI0LiAxMC4gMjAwNQ0KDQpQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25z IGZvciBJbnRlcm5ldCBFeHBsb3Jlcg0KYnkgVGhvbWFzIEZyYW5rIGFuZCBKb2hu IEhvbGRzd29ydGguDQpmaWxsUG9seWdvbiBtZXRob2QgaW1wbGVtZW50ZWQgYnkg TWF0dGhpZXUgSGFsbGVyLg0KDQpIaWdoIFBlcmZvcm1hbmNlIEphdmFTY3JpcHQg R3JhcGhpY3MgTGlicmFyeS4NClByb3ZpZGVzIG1ldGhvZHMNCi0gdG8gZHJhdyBs aW5lcywgcmVjdGFuZ2xlcywgZWxsaXBzZXMsIHBvbHlnb25zDQoJd2l0aCBzcGVj aWZpYWJsZSBsaW5lIHRoaWNrbmVzcywNCi0gdG8gZmlsbCByZWN0YW5nbGVzIGFu ZCBlbGxpcHNlcw0KLSB0byBkcmF3IHRleHQuDQpOT1RFOiBPcGVyYXRpb25zLCBm dW5jdGlvbnMgYW5kIGJyYW5jaGluZyBoYXZlIHJhdGhlciBiZWVuIG9wdGltaXpl ZA0KdG8gZWZmaWNpZW5jeSBhbmQgc3BlZWQgdGhhbiB0byBzaG9ydG5lc3Mgb2Yg c291cmNlIGNvZGUuDQoNCkxJQ0VOU0U6IExHUEwNCg0KVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0K bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l cmFsIFB1YmxpYw0KTGljZW5zZSAoTEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KdmVyc2lvbiAyLjEgb2Yg dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uDQoNClRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCk1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUgR05VDQpMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y ZSBkZXRhaWxzLg0KDQpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIGFsb25nIHdp dGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlDQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMz MCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBLA0Kb3Igc2VlIGh0dHA6Ly93 d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIuaHRtbA0KKi8NCg0KDQp2YXIgamdf aWh0bSwgamdfaWUsIGpnX2Zhc3QsIGpnX2RvbSwgamdfbW96LA0KamdfbjQgPSAo ZG9jdW1lbnQubGF5ZXJzICYmIHR5cGVvZiBkb2N1bWVudC5jbGFzc2VzICE9ICJ1 bmRlZmluZWQiKTsNCg0KDQpmdW5jdGlvbiBjaGtESFRNKHgsIGkpDQp7DQoJeCA9 IGRvY3VtZW50LmJvZHkgfHwgbnVsbDsNCglqZ19pZSA9IHggJiYgdHlwZW9mIHgu aW5zZXJ0QWRqYWNlbnRIVE1MICE9ICJ1bmRlZmluZWQiOw0KCWpnX2RvbSA9ICh4 ICYmICFqZ19pZSAmJg0KCQl0eXBlb2YgeC5hcHBlbmRDaGlsZCAhPSAidW5kZWZp bmVkIiAmJg0KCQl0eXBlb2YgZG9jdW1lbnQuY3JlYXRlUmFuZ2UgIT0gInVuZGVm aW5lZCIgJiYNCgkJdHlwZW9mIChpID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSku c2V0U3RhcnRCZWZvcmUgIT0gInVuZGVmaW5lZCIgJiYNCgkJdHlwZW9mIGkuY3Jl YXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsNCglqZ19paHRt ID0gIWpnX2llICYmICFqZ19kb20gJiYgeCAmJiB0eXBlb2YgeC5pbm5lckhUTUwg IT0gInVuZGVmaW5lZCI7DQoJamdfZmFzdCA9IGpnX2llICYmIGRvY3VtZW50LmFs bCAmJiAhd2luZG93Lm9wZXJhOw0KCWpnX21veiA9IGpnX2RvbSAmJiB0eXBlb2Yg eC5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOw0KfQ0KDQoNCmZ1bmN0 aW9uIHBudERvYygpDQp7DQoJdGhpcy53bmQuZG9jdW1lbnQud3JpdGUoamdfZmFz dD8gdGhpcy5odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICcnOw0K fQ0KDQoNCmZ1bmN0aW9uIHBudENudkRvbSgpDQp7DQoJdmFyIHggPSBkb2N1bWVu dC5jcmVhdGVSYW5nZSgpOw0KCXguc2V0U3RhcnRCZWZvcmUodGhpcy5jbnYpOw0K CXggPSB4LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChqZ19mYXN0PyB0aGlzLmh0 bVJwYygpIDogdGhpcy5odG0pOw0KCXRoaXMuY252LmFwcGVuZENoaWxkKHgpOw0K CXRoaXMuaHRtID0gJyc7DQp9DQoNCg0KZnVuY3Rpb24gcG50Q252SWUoKQ0Kew0K CXRoaXMuY252Lmluc2VydEFkamFjZW50SFRNTCgiQmVmb3JlRW5kIiwgamdfZmFz dD8gdGhpcy5odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICcnOw0K fQ0KDQoNCmZ1bmN0aW9uIHBudENudklodG0oKQ0Kew0KCXRoaXMuY252LmlubmVy SFRNTCArPSB0aGlzLmh0bTsNCgl0aGlzLmh0bSA9ICcnOw0KfQ0KDQoNCmZ1bmN0 aW9uIHBudENudigpDQp7DQoJdGhpcy5odG0gPSAnJzsNCn0NCg0KDQpmdW5jdGlv biBta0Rpdih4LCB5LCB3LCBoKQ0Kew0KCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxl PSJwb3NpdGlvbjphYnNvbHV0ZTsnKw0KCQknbGVmdDonICsgeCArICdweDsnKw0K CQkndG9wOicgKyB5ICsgJ3B4OycrDQoJCSd3aWR0aDonICsgdyArICdweDsnKw0K CQknaGVpZ2h0OicgKyBoICsgJ3B4OycrDQoJCSdjbGlwOnJlY3QoMCwnK3crJ3B4 LCcraCsncHgsMCk7JysNCgkJJ2JhY2tncm91bmQtY29sb3I6JyArIHRoaXMuY29s b3IgKw0KCQkoIWpnX21vej8gJztvdmVyZmxvdzpoaWRkZW4nIDogJycpKw0KCQkn OyI+PFwvZGl2Pic7DQp9DQoNCg0KZnVuY3Rpb24gbWtEaXZJZSh4LCB5LCB3LCBo KQ0Kew0KCXRoaXMuaHRtICs9ICclJScrdGhpcy5jb2xvcisnOycreCsnOycreSsn OycrdysnOycraCsnOyc7DQp9DQoNCg0KZnVuY3Rpb24gbWtEaXZQcnQoeCwgeSwg dywgaCkNCnsNCgl0aGlzLmh0bSArPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJz b2x1dGU7JysNCgkJJ2JvcmRlci1sZWZ0OicgKyB3ICsgJ3B4IHNvbGlkICcgKyB0 aGlzLmNvbG9yICsgJzsnKw0KCQknbGVmdDonICsgeCArICdweDsnKw0KCQkndG9w OicgKyB5ICsgJ3B4OycrDQoJCSd3aWR0aDowcHg7JysNCgkJJ2hlaWdodDonICsg aCArICdweDsnKw0KCQknY2xpcDpyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApOycr DQoJCSdiYWNrZ3JvdW5kLWNvbG9yOicgKyB0aGlzLmNvbG9yICsNCgkJKCFqZ19t b3o/ICc7b3ZlcmZsb3c6aGlkZGVuJyA6ICcnKSsNCgkJJzsiPjxcL2Rpdj4nOw0K fQ0KDQoNCmZ1bmN0aW9uIG1rTHlyKHgsIHksIHcsIGgpDQp7DQoJdGhpcy5odG0g Kz0gJzxsYXllciAnKw0KCQknbGVmdD0iJyArIHggKyAnIiAnKw0KCQkndG9wPSIn ICsgeSArICciICcrDQoJCSd3aWR0aD0iJyArIHcgKyAnIiAnKw0KCQknaGVpZ2h0 PSInICsgaCArICciICcrDQoJCSdiZ2NvbG9yPSInICsgdGhpcy5jb2xvciArICci PjxcL2xheWVyPlxuJzsNCn0NCg0KDQp2YXIgcmVnZXggPSAgLyUlKFteO10rKTso W147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOy9nOw0KZnVuY3Rpb24gaHRt UnBjKCkNCnsNCglyZXR1cm4gdGhpcy5odG0ucmVwbGFjZSgNCgkJcmVnZXgsDQoJ CSc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7 YmFja2dyb3VuZC1jb2xvcjonKw0KCQknJDE7bGVmdDokMjt0b3A6JDM7d2lkdGg6 JDQ7aGVpZ2h0OiQ1Ij48L2Rpdj5cbicpOw0KfQ0KDQoNCmZ1bmN0aW9uIGh0bVBy dFJwYygpDQp7DQoJcmV0dXJuIHRoaXMuaHRtLnJlcGxhY2UoDQoJCXJlZ2V4LA0K CQknPGRpdiBzdHlsZT0ib3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRl O2JhY2tncm91bmQtY29sb3I6JysNCgkJJyQxO2xlZnQ6JDI7dG9wOiQzO3dpZHRo OiQ0O2hlaWdodDokNTtib3JkZXItbGVmdDokNHB4IHNvbGlkICQxIj48L2Rpdj5c bicpOw0KfQ0KDQoNCmZ1bmN0aW9uIG1rTGluKHgxLCB5MSwgeDIsIHkyKQ0Kew0K CWlmICh4MSA+IHgyKQ0KCXsNCgkJdmFyIF94MiA9IHgyOw0KCQl2YXIgX3kyID0g eTI7DQoJCXgyID0geDE7DQoJCXkyID0geTE7DQoJCXgxID0gX3gyOw0KCQl5MSA9 IF95MjsNCgl9DQoJdmFyIGR4ID0geDIteDEsIGR5ID0gTWF0aC5hYnMoeTIteTEp LA0KCXggPSB4MSwgeSA9IHkxLA0KCXlJbmNyID0gKHkxID4geTIpPyAtMSA6IDE7 DQoNCglpZiAoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1 ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHgsDQoJCW94ID0geDsNCgkJd2hp bGUgKChkeC0tKSA+IDApDQoJCXsNCgkJCSsreDsNCgkJCWlmIChwID4gMCkNCgkJ CXsNCgkJCQl0aGlzLm1rRGl2KG94LCB5LCB4LW94LCAxKTsNCgkJCQl5ICs9IHlJ bmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJCW94ID0geDsNCgkJCX0NCgkJCWVsc2Ug cCArPSBwcjsNCgkJfQ0KCQl0aGlzLm1rRGl2KG94LCB5LCB4Mi1veCsxLCAxKTsN Cgl9DQoNCgllbHNlDQoJew0KCQl2YXIgcHIgPSBkeDw8MSwNCgkJcHJ1ID0gcHIg LSAoZHk8PDEpLA0KCQlwID0gcHItZHksDQoJCW95ID0geTsNCgkJaWYgKHkyIDw9 IHkxKQ0KCQl7DQoJCQl3aGlsZSAoKGR5LS0pID4gMCkNCgkJCXsNCgkJCQlpZiAo cCA+IDApDQoJCQkJew0KCQkJCQl0aGlzLm1rRGl2KHgrKywgeSwgMSwgb3kteSsx KTsNCgkJCQkJeSArPSB5SW5jcjsNCgkJCQkJcCArPSBwcnU7DQoJCQkJCW95ID0g eTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJeSArPSB5SW5jcjsNCgkJ CQkJcCArPSBwcjsNCgkJCQl9DQoJCQl9DQoJCQl0aGlzLm1rRGl2KHgyLCB5Miwg MSwgb3kteTIrMSk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl3aGlsZSAoKGR5LS0p ID4gMCkNCgkJCXsNCgkJCQl5ICs9IHlJbmNyOw0KCQkJCWlmIChwID4gMCkNCgkJ CQl7DQoJCQkJCXRoaXMubWtEaXYoeCsrLCBveSwgMSwgeS1veSk7DQoJCQkJCXAg Kz0gcHJ1Ow0KCQkJCQlveSA9IHk7DQoJCQkJfQ0KCQkJCWVsc2UgcCArPSBwcjsN CgkJCX0NCgkJCXRoaXMubWtEaXYoeDIsIG95LCAxLCB5Mi1veSsxKTsNCgkJfQ0K CX0NCn0NCg0KDQpmdW5jdGlvbiBta0xpbjJEKHgxLCB5MSwgeDIsIHkyKQ0Kew0K CWlmICh4MSA+IHgyKQ0KCXsNCgkJdmFyIF94MiA9IHgyOw0KCQl2YXIgX3kyID0g eTI7DQoJCXgyID0geDE7DQoJCXkyID0geTE7DQoJCXgxID0gX3gyOw0KCQl5MSA9 IF95MjsNCgl9DQoJdmFyIGR4ID0geDIteDEsIGR5ID0gTWF0aC5hYnMoeTIteTEp LA0KCXggPSB4MSwgeSA9IHkxLA0KCXlJbmNyID0gKHkxID4geTIpPyAtMSA6IDE7 DQoNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0KCWlmIChkeCA+PSBkeSkNCgl7DQoJ CWlmIChkeCA+IDAgJiYgcy0zID4gMCkNCgkJew0KCQkJdmFyIF9zID0gKHMqZHgq TWF0aC5zcXJ0KDErZHkqZHkvKGR4KmR4KSktZHgtKHM+PjEpKmR5KSAvIGR4Ow0K CQkJX3MgPSAoIShzLTQpPyBNYXRoLmNlaWwoX3MpIDogTWF0aC5yb3VuZChfcykp ICsgMTsNCgkJfQ0KCQllbHNlIHZhciBfcyA9IHM7DQoJCXZhciBhZCA9IE1hdGgu Y2VpbChzLzIpOw0KDQoJCXZhciBwciA9IGR5PDwxLA0KCQlwcnUgPSBwciAtIChk eDw8MSksDQoJCXAgPSBwci1keCwNCgkJb3ggPSB4Ow0KCQl3aGlsZSAoKGR4LS0p ID4gMCkNCgkJew0KCQkJKyt4Ow0KCQkJaWYgKHAgPiAwKQ0KCQkJew0KCQkJCXRo aXMubWtEaXYob3gsIHksIHgtb3grYWQsIF9zKTsNCgkJCQl5ICs9IHlJbmNyOw0K CQkJCXAgKz0gcHJ1Ow0KCQkJCW94ID0geDsNCgkJCX0NCgkJCWVsc2UgcCArPSBw cjsNCgkJfQ0KCQl0aGlzLm1rRGl2KG94LCB5LCB4Mi1veCthZCsxLCBfcyk7DQoJ fQ0KDQoJZWxzZQ0KCXsNCgkJaWYgKHMtMyA+IDApDQoJCXsNCgkJCXZhciBfcyA9 IChzKmR5Kk1hdGguc3FydCgxK2R4KmR4LyhkeSpkeSkpLShzPj4xKSpkeC1keSkg LyBkeTsNCgkJCV9zID0gKCEocy00KT8gTWF0aC5jZWlsKF9zKSA6IE1hdGgucm91 bmQoX3MpKSArIDE7DQoJCX0NCgkJZWxzZSB2YXIgX3MgPSBzOw0KCQl2YXIgYWQg PSBNYXRoLnJvdW5kKHMvMik7DQoNCgkJdmFyIHByID0gZHg8PDEsDQoJCXBydSA9 IHByIC0gKGR5PDwxKSwNCgkJcCA9IHByLWR5LA0KCQlveSA9IHk7DQoJCWlmICh5 MiA8PSB5MSkNCgkJew0KCQkJKythZDsNCgkJCXdoaWxlICgoZHktLSkgPiAwKQ0K CQkJew0KCQkJCWlmIChwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMubWtEaXYoeCsr LCB5LCBfcywgb3kteSthZCk7DQoJCQkJCXkgKz0geUluY3I7DQoJCQkJCXAgKz0g cHJ1Ow0KCQkJCQlveSA9IHk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJ CXkgKz0geUluY3I7DQoJCQkJCXAgKz0gcHI7DQoJCQkJfQ0KCQkJfQ0KCQkJdGhp cy5ta0Rpdih4MiwgeTIsIF9zLCBveS15MithZCk7DQoJCX0NCgkJZWxzZQ0KCQl7 DQoJCQl3aGlsZSAoKGR5LS0pID4gMCkNCgkJCXsNCgkJCQl5ICs9IHlJbmNyOw0K CQkJCWlmIChwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMubWtEaXYoeCsrLCBveSwg X3MsIHktb3krYWQpOw0KCQkJCQlwICs9IHBydTsNCgkJCQkJb3kgPSB5Ow0KCQkJ CX0NCgkJCQllbHNlIHAgKz0gcHI7DQoJCQl9DQoJCQl0aGlzLm1rRGl2KHgyLCBv eSwgX3MsIHkyLW95K2FkKzEpOw0KCQl9DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIG1r TGluRG90dCh4MSwgeTEsIHgyLCB5MikNCnsNCglpZiAoeDEgPiB4MikNCgl7DQoJ CXZhciBfeDIgPSB4MjsNCgkJdmFyIF95MiA9IHkyOw0KCQl4MiA9IHgxOw0KCQl5 MiA9IHkxOw0KCQl4MSA9IF94MjsNCgkJeTEgPSBfeTI7DQoJfQ0KCXZhciBkeCA9 IHgyLXgxLCBkeSA9IE1hdGguYWJzKHkyLXkxKSwNCgl4ID0geDEsIHkgPSB5MSwN Cgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxLA0KCWRydyA9IHRydWU7DQoJaWYg KGR4ID49IGR5KQ0KCXsNCgkJdmFyIHByID0gZHk8PDEsDQoJCXBydSA9IHByIC0g KGR4PDwxKSwNCgkJcCA9IHByLWR4Ow0KCQl3aGlsZSAoKGR4LS0pID4gMCkNCgkJ ew0KCQkJaWYgKGRydykgdGhpcy5ta0Rpdih4LCB5LCAxLCAxKTsNCgkJCWRydyA9 ICFkcnc7DQoJCQlpZiAocCA+IDApDQoJCQl7DQoJCQkJeSArPSB5SW5jcjsNCgkJ CQlwICs9IHBydTsNCgkJCX0NCgkJCWVsc2UgcCArPSBwcjsNCgkJCSsreDsNCgkJ fQ0KCQlpZiAoZHJ3KSB0aGlzLm1rRGl2KHgsIHksIDEsIDEpOw0KCX0NCg0KCWVs c2UNCgl7DQoJCXZhciBwciA9IGR4PDwxLA0KCQlwcnUgPSBwciAtIChkeTw8MSks DQoJCXAgPSBwci1keTsNCgkJd2hpbGUgKChkeS0tKSA+IDApDQoJCXsNCgkJCWlm IChkcncpIHRoaXMubWtEaXYoeCwgeSwgMSwgMSk7DQoJCQlkcncgPSAhZHJ3Ow0K CQkJeSArPSB5SW5jcjsNCgkJCWlmIChwID4gMCkNCgkJCXsNCgkJCQkrK3g7DQoJ CQkJcCArPSBwcnU7DQoJCQl9DQoJCQllbHNlIHAgKz0gcHI7DQoJCX0NCgkJaWYg KGRydykgdGhpcy5ta0Rpdih4LCB5LCAxLCAxKTsNCgl9DQp9DQoNCg0KZnVuY3Rp b24gbWtPdihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpDQp7DQoJdmFyIGEgPSB3 aWR0aD4+MSwgYiA9IGhlaWdodD4+MSwNCgl3b2QgPSB3aWR0aCYxLCBob2QgPSAo aGVpZ2h0JjEpKzEsDQoJY3ggPSBsZWZ0K2EsIGN5ID0gdG9wK2IsDQoJeCA9IDAs IHkgPSBiLA0KCW94ID0gMCwgb3kgPSBiLA0KCWFhID0gKGEqYSk8PDEsIGJiID0g KGIqYik8PDEsDQoJc3QgPSAoYWE+PjEpKigxLShiPDwxKSkgKyBiYiwNCgl0dCA9 IChiYj4+MSkgLSBhYSooKGI8PDEpLTEpLA0KCXcsIGg7DQoJd2hpbGUgKHkgPiAw KQ0KCXsNCgkJaWYgKHN0IDwgMCkNCgkJew0KCQkJc3QgKz0gYmIqKCh4PDwxKSsz KTsNCgkJCXR0ICs9IChiYjw8MSkqKCsreCk7DQoJCX0NCgkJZWxzZSBpZiAodHQg PCAwKQ0KCQl7DQoJCQlzdCArPSBiYiooKHg8PDEpKzMpIC0gKGFhPDwxKSooeS0x KTsNCgkJCXR0ICs9IChiYjw8MSkqKCsreCkgLSBhYSooKCh5LS0pPDwxKS0zKTsN CgkJCXcgPSB4LW94Ow0KCQkJaCA9IG95LXk7DQoJCQlpZiAodyYyICYmIGgmMikN CgkJCXsNCgkJCQl0aGlzLm1rT3ZRZHMoY3gsIGN5LCAteCsyLCBveCt3b2QsIC1v eSwgb3ktMStob2QsIDEsIDEpOw0KCQkJCXRoaXMubWtPdlFkcyhjeCwgY3ksIC14 KzEsIHgtMSt3b2QsIC15LTEsIHkraG9kLCAxLCAxKTsNCgkJCX0NCgkJCWVsc2Ug dGhpcy5ta092UWRzKGN4LCBjeSwgLXgrMSwgb3grd29kLCAtb3ksIG95LWgraG9k LCB3LCBoKTsNCgkJCW94ID0geDsNCgkJCW95ID0geTsNCgkJfQ0KCQllbHNlDQoJ CXsNCgkJCXR0IC09IGFhKigoeTw8MSktMyk7DQoJCQlzdCAtPSAoYWE8PDEpKigt LXkpOw0KCQl9DQoJfQ0KCXRoaXMubWtEaXYoY3gtYSwgY3ktb3ksIGEtb3grMSwg KG95PDwxKStob2QpOw0KCXRoaXMubWtEaXYoY3grb3grd29kLCBjeS1veSwgYS1v eCsxLCAob3k8PDEpK2hvZCk7DQp9DQoNCg0KZnVuY3Rpb24gbWtPdjJEKGxlZnQs IHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0K CXdpZHRoICs9IHMtMTsNCgloZWlnaHQgKz0gcy0xOw0KCXZhciBhID0gd2lkdGg+ PjEsIGIgPSBoZWlnaHQ+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gKGhlaWdo dCYxKSsxLA0KCWN4ID0gbGVmdCthLCBjeSA9IHRvcCtiLA0KCXggPSAwLCB5ID0g YiwNCglhYSA9IChhKmEpPDwxLCBiYiA9IChiKmIpPDwxLA0KCXN0ID0gKGFhPj4x KSooMS0oYjw8MSkpICsgYmIsDQoJdHQgPSAoYmI+PjEpIC0gYWEqKChiPDwxKS0x KTsNCg0KCWlmIChzLTQgPCAwICYmICghKHMtMikgfHwgd2lkdGgtNTEgPiAwICYm IGhlaWdodC01MSA+IDApKQ0KCXsNCgkJdmFyIG94ID0gMCwgb3kgPSBiLA0KCQl3 LCBoLA0KCQlweGwsIHB4ciwgcHh0LCBweGIsIHB4dzsNCgkJd2hpbGUgKHkgPiAw KQ0KCQl7DQoJCQlpZiAoc3QgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJiKigoeDw8 MSkrMyk7DQoJCQkJdHQgKz0gKGJiPDwxKSooKyt4KTsNCgkJCX0NCgkJCWVsc2Ug aWYgKHR0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYiooKHg8PDEpKzMpIC0gKGFh PDwxKSooeS0xKTsNCgkJCQl0dCArPSAoYmI8PDEpKigrK3gpIC0gYWEqKCgoeS0t KTw8MSktMyk7DQoJCQkJdyA9IHgtb3g7DQoJCQkJaCA9IG95LXk7DQoNCgkJCQlp ZiAody0xKQ0KCQkJCXsNCgkJCQkJcHh3ID0gdysxKyhzJjEpOw0KCQkJCQloID0g czsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoaC0xKQ0KCQkJCXsNCgkJCQkJcHh3ID0g czsNCgkJCQkJaCArPSAxKyhzJjEpOw0KCQkJCX0NCgkJCQllbHNlIHB4dyA9IGgg PSBzOw0KCQkJCXRoaXMubWtPdlFkcyhjeCwgY3ksIC14KzEsIG94LXB4dyt3K3dv ZCwgLW95LCAtaCtveStob2QsIHB4dywgaCk7DQoJCQkJb3ggPSB4Ow0KCQkJCW95 ID0geTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl0dCAtPSBhYSooKHk8PDEp LTMpOw0KCQkJCXN0IC09IChhYTw8MSkqKC0teSk7DQoJCQl9DQoJCX0NCgkJdGhp cy5ta0RpdihjeC1hLCBjeS1veSwgcywgKG95PDwxKStob2QpOw0KCQl0aGlzLm1r RGl2KGN4K2Erd29kLXMrMSwgY3ktb3ksIHMsIChveTw8MSkraG9kKTsNCgl9DQoN CgllbHNlDQoJew0KCQl2YXIgX2EgPSAod2lkdGgtKChzLTEpPDwxKSk+PjEsDQoJ CV9iID0gKGhlaWdodC0oKHMtMSk8PDEpKT4+MSwNCgkJX3ggPSAwLCBfeSA9IF9i LA0KCQlfYWEgPSAoX2EqX2EpPDwxLCBfYmIgPSAoX2IqX2IpPDwxLA0KCQlfc3Qg PSAoX2FhPj4xKSooMS0oX2I8PDEpKSArIF9iYiwNCgkJX3R0ID0gKF9iYj4+MSkg LSBfYWEqKChfYjw8MSktMSksDQoNCgkJcHhsID0gbmV3IEFycmF5KCksDQoJCXB4 dCA9IG5ldyBBcnJheSgpLA0KCQlfcHhiID0gbmV3IEFycmF5KCk7DQoJCXB4bFsw XSA9IDA7DQoJCXB4dFswXSA9IGI7DQoJCV9weGJbMF0gPSBfYi0xOw0KCQl3aGls ZSAoeSA+IDApDQoJCXsNCgkJCWlmIChzdCA8IDApDQoJCQl7DQoJCQkJc3QgKz0g YmIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSAoYmI8PDEpKigrK3gpOw0KCQkJCXB4 bFtweGwubGVuZ3RoXSA9IHg7DQoJCQkJcHh0W3B4dC5sZW5ndGhdID0geTsNCgkJ CX0NCgkJCWVsc2UgaWYgKHR0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYiooKHg8 PDEpKzMpIC0gKGFhPDwxKSooeS0xKTsNCgkJCQl0dCArPSAoYmI8PDEpKigrK3gp IC0gYWEqKCgoeS0tKTw8MSktMyk7DQoJCQkJcHhsW3B4bC5sZW5ndGhdID0geDsN CgkJCQlweHRbcHh0Lmxlbmd0aF0gPSB5Ow0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0K CQkJCXR0IC09IGFhKigoeTw8MSktMyk7DQoJCQkJc3QgLT0gKGFhPDwxKSooLS15 KTsNCgkJCX0NCg0KCQkJaWYgKF95ID4gMCkNCgkJCXsNCgkJCQlpZiAoX3N0IDwg MCkNCgkJCQl7DQoJCQkJCV9zdCArPSBfYmIqKChfeDw8MSkrMyk7DQoJCQkJCV90 dCArPSAoX2JiPDwxKSooKytfeCk7DQoJCQkJCV9weGJbX3B4Yi5sZW5ndGhdID0g X3ktMTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoX3R0IDwgMCkNCgkJCQl7DQoJCQkJ CV9zdCArPSBfYmIqKChfeDw8MSkrMykgLSAoX2FhPDwxKSooX3ktMSk7DQoJCQkJ CV90dCArPSAoX2JiPDwxKSooKytfeCkgLSBfYWEqKCgoX3ktLSk8PDEpLTMpOw0K CQkJCQlfcHhiW19weGIubGVuZ3RoXSA9IF95LTE7DQoJCQkJfQ0KCQkJCWVsc2UN CgkJCQl7DQoJCQkJCV90dCAtPSBfYWEqKChfeTw8MSktMyk7DQoJCQkJCV9zdCAt PSAoX2FhPDwxKSooLS1feSk7DQoJCQkJCV9weGJbX3B4Yi5sZW5ndGgtMV0tLTsN CgkJCQl9DQoJCQl9DQoJCX0NCg0KCQl2YXIgb3ggPSAwLCBveSA9IGIsDQoJCV9v eSA9IF9weGJbMF0sDQoJCWwgPSBweGwubGVuZ3RoLA0KCQl3LCBoOw0KCQlmb3Ig KHZhciBpID0gMDsgaSA8IGw7IGkrKykNCgkJew0KCQkJaWYgKHR5cGVvZiBfcHhi W2ldICE9ICJ1bmRlZmluZWQiKQ0KCQkJew0KCQkJCWlmIChfcHhiW2ldIDwgX295 IHx8IHB4dFtpXSA8IG95KQ0KCQkJCXsNCgkJCQkJeCA9IHB4bFtpXTsNCgkJCQkJ dGhpcy5ta092UWRzKGN4LCBjeSwgLXgrMSwgb3grd29kLCAtb3ksIF9veStob2Qs IHgtb3gsIG95LV9veSk7DQoJCQkJCW94ID0geDsNCgkJCQkJb3kgPSBweHRbaV07 DQoJCQkJCV9veSA9IF9weGJbaV07DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJ ew0KCQkJCXggPSBweGxbaV07DQoJCQkJdGhpcy5ta0RpdihjeC14KzEsIGN5LW95 LCAxLCAob3k8PDEpK2hvZCk7DQoJCQkJdGhpcy5ta0RpdihjeCtveCt3b2QsIGN5 LW95LCAxLCAob3k8PDEpK2hvZCk7DQoJCQkJb3ggPSB4Ow0KCQkJCW95ID0gcHh0 W2ldOw0KCQkJfQ0KCQl9DQoJCXRoaXMubWtEaXYoY3gtYSwgY3ktb3ksIDEsIChv eTw8MSkraG9kKTsNCgkJdGhpcy5ta0RpdihjeCtveCt3b2QsIGN5LW95LCAxLCAo b3k8PDEpK2hvZCk7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIG1rT3ZEb3R0KGxlZnQs IHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgYSA9IHdpZHRoPj4xLCBiID0g aGVpZ2h0Pj4xLA0KCXdvZCA9IHdpZHRoJjEsIGhvZCA9IGhlaWdodCYxLA0KCWN4 ID0gbGVmdCthLCBjeSA9IHRvcCtiLA0KCXggPSAwLCB5ID0gYiwNCglhYTIgPSAo YSphKTw8MSwgYWE0ID0gYWEyPDwxLCBiYiA9IChiKmIpPDwxLA0KCXN0ID0gKGFh Mj4+MSkqKDEtKGI8PDEpKSArIGJiLA0KCXR0ID0gKGJiPj4xKSAtIGFhMiooKGI8 PDEpLTEpLA0KCWRydyA9IHRydWU7DQoJd2hpbGUgKHkgPiAwKQ0KCXsNCgkJaWYg KHN0IDwgMCkNCgkJew0KCQkJc3QgKz0gYmIqKCh4PDwxKSszKTsNCgkJCXR0ICs9 IChiYjw8MSkqKCsreCk7DQoJCX0NCgkJZWxzZSBpZiAodHQgPCAwKQ0KCQl7DQoJ CQlzdCArPSBiYiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJdHQgKz0gKGJi PDwxKSooKyt4KSAtIGFhMiooKCh5LS0pPDwxKS0zKTsNCgkJfQ0KCQllbHNlDQoJ CXsNCgkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJc3QgLT0gYWE0KigtLXkp Ow0KCQl9DQoJCWlmIChkcncpIHRoaXMubWtPdlFkcyhjeCwgY3ksIC14LCB4K3dv ZCwgLXksIHkraG9kLCAxLCAxKTsNCgkJZHJ3ID0gIWRydzsNCgl9DQp9DQoNCg0K ZnVuY3Rpb24gbWtSZWN0KHgsIHksIHcsIGgpDQp7DQoJdmFyIHMgPSB0aGlzLnN0 cm9rZTsNCgl0aGlzLm1rRGl2KHgsIHksIHcsIHMpOw0KCXRoaXMubWtEaXYoeCt3 LCB5LCBzLCBoKTsNCgl0aGlzLm1rRGl2KHgsIHkraCwgdytzLCBzKTsNCgl0aGlz Lm1rRGl2KHgsIHkrcywgcywgaC1zKTsNCn0NCg0KDQpmdW5jdGlvbiBta1JlY3RE b3R0KHgsIHksIHcsIGgpDQp7DQoJdGhpcy5kcmF3TGluZSh4LCB5LCB4K3csIHkp Ow0KCXRoaXMuZHJhd0xpbmUoeCt3LCB5LCB4K3csIHkraCk7DQoJdGhpcy5kcmF3 TGluZSh4LCB5K2gsIHgrdywgeStoKTsNCgl0aGlzLmRyYXdMaW5lKHgsIHksIHgs IHkraCk7DQp9DQoNCg0KZnVuY3Rpb24ganNnRm9udCgpDQp7DQoJdGhpcy5QTEFJ TiA9ICdmb250LXdlaWdodDpub3JtYWw7JzsNCgl0aGlzLkJPTEQgPSAnZm9udC13 ZWlnaHQ6Ym9sZDsnOw0KCXRoaXMuSVRBTElDID0gJ2ZvbnQtc3R5bGU6aXRhbGlj Oyc7DQoJdGhpcy5JVEFMSUNfQk9MRCA9IHRoaXMuSVRBTElDICsgdGhpcy5CT0xE Ow0KCXRoaXMuQk9MRF9JVEFMSUMgPSB0aGlzLklUQUxJQ19CT0xEOw0KfQ0KdmFy IEZvbnQgPSBuZXcganNnRm9udCgpOw0KDQoNCmZ1bmN0aW9uIGpzZ1N0cm9rZSgp DQp7DQoJdGhpcy5ET1RURUQgPSAtMTsNCn0NCnZhciBTdHJva2UgPSBuZXcganNn U3Ryb2tlKCk7DQoNCg0KZnVuY3Rpb24ganNHcmFwaGljcyhpZCwgd25kKQ0Kew0K CXRoaXMuc2V0Q29sb3IgPSBuZXcgRnVuY3Rpb24oJ2FyZycsICd0aGlzLmNvbG9y ID0gYXJnLnRvTG93ZXJDYXNlKCk7Jyk7DQoNCgl0aGlzLnNldFN0cm9rZSA9IGZ1 bmN0aW9uKHgpDQoJew0KCQl0aGlzLnN0cm9rZSA9IHg7DQoJCWlmICghKHgrMSkp DQoJCXsNCgkJCXRoaXMuZHJhd0xpbmUgPSBta0xpbkRvdHQ7DQoJCQl0aGlzLm1r T3YgPSBta092RG90dDsNCgkJCXRoaXMuZHJhd1JlY3QgPSBta1JlY3REb3R0Ow0K CQl9DQoJCWVsc2UgaWYgKHgtMSA+IDApDQoJCXsNCgkJCXRoaXMuZHJhd0xpbmUg PSBta0xpbjJEOw0KCQkJdGhpcy5ta092ID0gbWtPdjJEOw0KCQkJdGhpcy5kcmF3 UmVjdCA9IG1rUmVjdDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMuZHJhd0xp bmUgPSBta0xpbjsNCgkJCXRoaXMubWtPdiA9IG1rT3Y7DQoJCQl0aGlzLmRyYXdS ZWN0ID0gbWtSZWN0Ow0KCQl9DQoJfTsNCg0KDQoJdGhpcy5zZXRQcmludGFibGUg PSBmdW5jdGlvbihhcmcpDQoJew0KCQl0aGlzLnByaW50YWJsZSA9IGFyZzsNCgkJ aWYgKGpnX2Zhc3QpDQoJCXsNCgkJCXRoaXMubWtEaXYgPSBta0RpdkllOw0KCQkJ dGhpcy5odG1ScGMgPSBhcmc/IGh0bVBydFJwYyA6IGh0bVJwYzsNCgkJfQ0KCQll bHNlIHRoaXMubWtEaXYgPSBqZ19uND8gbWtMeXIgOiBhcmc/IG1rRGl2UHJ0IDog bWtEaXY7DQoJfTsNCg0KDQoJdGhpcy5zZXRGb250ID0gZnVuY3Rpb24oZmFtLCBz eiwgc3R5KQ0KCXsNCgkJdGhpcy5mdEZhbSA9IGZhbTsNCgkJdGhpcy5mdFN6ID0g c3o7DQoJCXRoaXMuZnRTdHkgPSBzdHkgfHwgRm9udC5QTEFJTjsNCgl9Ow0KDQoN Cgl0aGlzLmRyYXdQb2x5bGluZSA9IHRoaXMuZHJhd1BvbHlMaW5lID0gZnVuY3Rp b24oeCwgeSwgcykNCgl7DQoJCWZvciAodmFyIGk9MCA7IGk8eC5sZW5ndGgtMSA7 IGkrKyApDQoJCQl0aGlzLmRyYXdMaW5lKHhbaV0sIHlbaV0sIHhbaSsxXSwgeVtp KzFdKTsNCgl9Ow0KDQoNCgl0aGlzLmZpbGxSZWN0ID0gZnVuY3Rpb24oeCwgeSwg dywgaCkNCgl7DQoJCXRoaXMubWtEaXYoeCwgeSwgdywgaCk7DQoJfTsNCg0KDQoJ dGhpcy5kcmF3UG9seWdvbiA9IGZ1bmN0aW9uKHgsIHkpDQoJew0KCQl0aGlzLmRy YXdQb2x5bGluZSh4LCB5KTsNCgkJdGhpcy5kcmF3TGluZSh4W3gubGVuZ3RoLTFd LCB5W3gubGVuZ3RoLTFdLCB4WzBdLCB5WzBdKTsNCgl9Ow0KDQoNCgl0aGlzLmRy YXdFbGxpcHNlID0gdGhpcy5kcmF3T3ZhbCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgp DQoJew0KCQl0aGlzLm1rT3YoeCwgeSwgdywgaCk7DQoJfTsNCg0KDQoJdGhpcy5m aWxsRWxsaXBzZSA9IHRoaXMuZmlsbE92YWwgPSBmdW5jdGlvbihsZWZ0LCB0b3As IHcsIGgpDQoJew0KCQl2YXIgYSA9ICh3IC09IDEpPj4xLCBiID0gKGggLT0gMSk+ PjEsDQoJCXdvZCA9ICh3JjEpKzEsIGhvZCA9IChoJjEpKzEsDQoJCWN4ID0gbGVm dCthLCBjeSA9IHRvcCtiLA0KCQl4ID0gMCwgeSA9IGIsDQoJCW94ID0gMCwgb3kg PSBiLA0KCQlhYTIgPSAoYSphKTw8MSwgYWE0ID0gYWEyPDwxLCBiYiA9IChiKmIp PDwxLA0KCQlzdCA9IChhYTI+PjEpKigxLShiPDwxKSkgKyBiYiwNCgkJdHQgPSAo YmI+PjEpIC0gYWEyKigoYjw8MSktMSksDQoJCXB4bCwgZHcsIGRoOw0KCQlpZiAo dysxKSB3aGlsZSAoeSA+IDApDQoJCXsNCgkJCWlmIChzdCA8IDApDQoJCQl7DQoJ CQkJc3QgKz0gYmIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSAoYmI8PDEpKigrK3gp Ow0KCQkJfQ0KCQkJZWxzZSBpZiAodHQgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJi KigoeDw8MSkrMykgLSBhYTQqKHktMSk7DQoJCQkJcHhsID0gY3gteDsNCgkJCQlk dyA9ICh4PDwxKSt3b2Q7DQoJCQkJdHQgKz0gKGJiPDwxKSooKyt4KSAtIGFhMioo KCh5LS0pPDwxKS0zKTsNCgkJCQlkaCA9IG95LXk7DQoJCQkJdGhpcy5ta0Rpdihw eGwsIGN5LW95LCBkdywgZGgpOw0KCQkJCXRoaXMubWtEaXYocHhsLCBjeSt5K2hv ZCwgZHcsIGRoKTsNCgkJCQlveCA9IHg7DQoJCQkJb3kgPSB5Ow0KCQkJfQ0KCQkJ ZWxzZQ0KCQkJew0KCQkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJCXN0IC09 IGFhNCooLS15KTsNCgkJCX0NCgkJfQ0KCQl0aGlzLm1rRGl2KGN4LWEsIGN5LW95 LCB3KzEsIChveTw8MSkraG9kKTsNCgl9Ow0KDQoNCi8qIGZpbGxQb2x5Z29uIG1l dGhvZCwgaW1wbGVtZW50ZWQgYnkgTWF0dGhpZXUgSGFsbGVyLg0KVGhpcyBqYXZh c2NyaXB0IGZ1bmN0aW9uIGlzIGFuIGFkYXB0YXRpb24gb2YgdGhlIGdkSW1hZ2VG aWxsZWRQb2x5Z29uIGZvciBXYWx0ZXIgWm9ybiBsaWIuDQpDIHNvdXJjZSBvZiBH RCAxLjguNCBmb3VuZCBhdCBodHRwOi8vd3d3LmJvdXRlbGwuY29tL2dkLw0KDQpU SEFOS1MgdG8gS2lyc3RlbiBTY2h1bHogZm9yIHRoZSBwb2x5Z29uIGZpeGVzIQ0K DQpUaGUgaW50ZXJzZWN0aW9uIGZpbmRpbmcgdGVjaG5pcXVlIG9mIHRoaXMgY29k ZSBjb3VsZCBiZSBpbXByb3ZlZA0KYnkgcmVtZW1iZXJpbmcgdGhlIHByZXZpb3Vz IGludGVydGVyc2VjdGlvbiwgYW5kIGJ5IHVzaW5nIHRoZSBzbG9wZS4NClRoYXQg Y291bGQgaGVscCB0byBhZGp1c3QgaW50ZXJzZWN0aW9ucyB0byBwcm9kdWNlIGEg bmljZQ0KaW50ZXJpb3JfZXh0cmVtYS4gKi8NCgl0aGlzLmZpbGxQb2x5Z29uID0g ZnVuY3Rpb24oYXJyYXlfeCwgYXJyYXlfeSkNCgl7DQoJCXZhciBpOw0KCQl2YXIg eTsNCgkJdmFyIG1pbnksIG1heHk7DQoJCXZhciB4MSwgeTE7DQoJCXZhciB4Miwg eTI7DQoJCXZhciBpbmQxLCBpbmQyOw0KCQl2YXIgaW50czsNCg0KCQl2YXIgbiA9 IGFycmF5X3gubGVuZ3RoOw0KDQoJCWlmICghbikgcmV0dXJuOw0KDQoNCgkJbWlu eSA9IGFycmF5X3lbMF07DQoJCW1heHkgPSBhcnJheV95WzBdOw0KCQlmb3IgKGkg PSAxOyBpIDwgbjsgaSsrKQ0KCQl7DQoJCQlpZiAoYXJyYXlfeVtpXSA8IG1pbnkp DQoJCQkJbWlueSA9IGFycmF5X3lbaV07DQoNCgkJCWlmIChhcnJheV95W2ldID4g bWF4eSkNCgkJCQltYXh5ID0gYXJyYXlfeVtpXTsNCgkJfQ0KCQlmb3IgKHkgPSBt aW55OyB5IDw9IG1heHk7IHkrKykNCgkJew0KCQkJdmFyIHBvbHlJbnRzID0gbmV3 IEFycmF5KCk7DQoJCQlpbnRzID0gMDsNCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBp KyspDQoJCQl7DQoJCQkJaWYgKCFpKQ0KCQkJCXsNCgkJCQkJaW5kMSA9IG4tMTsN CgkJCQkJaW5kMiA9IDA7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCWlu ZDEgPSBpLTE7DQoJCQkJCWluZDIgPSBpOw0KCQkJCX0NCgkJCQl5MSA9IGFycmF5 X3lbaW5kMV07DQoJCQkJeTIgPSBhcnJheV95W2luZDJdOw0KCQkJCWlmICh5MSA8 IHkyKQ0KCQkJCXsNCgkJCQkJeDEgPSBhcnJheV94W2luZDFdOw0KCQkJCQl4MiA9 IGFycmF5X3hbaW5kMl07DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKHkxID4geTIpDQoJ CQkJew0KCQkJCQl5MiA9IGFycmF5X3lbaW5kMV07DQoJCQkJCXkxID0gYXJyYXlf eVtpbmQyXTsNCgkJCQkJeDIgPSBhcnJheV94W2luZDFdOw0KCQkJCQl4MSA9IGFy cmF5X3hbaW5kMl07DQoJCQkJfQ0KCQkJCWVsc2UgY29udGludWU7DQoNCgkJCQkg Ly8gbW9kaWZpZWQgMTEuIDIuIDIwMDQgV2FsdGVyIFpvcm4NCgkJCQlpZiAoKHkg Pj0geTEpICYmICh5IDwgeTIpKQ0KCQkJCQlwb2x5SW50c1tpbnRzKytdID0gTWF0 aC5yb3VuZCgoeS15MSkgKiAoeDIteDEpIC8gKHkyLXkxKSArIHgxKTsNCg0KCQkJ CWVsc2UgaWYgKCh5ID09IG1heHkpICYmICh5ID4geTEpICYmICh5IDw9IHkyKSkN CgkJCQkJcG9seUludHNbaW50cysrXSA9IE1hdGgucm91bmQoKHkteTEpICogKHgy LXgxKSAvICh5Mi15MSkgKyB4MSk7DQoJCQl9DQoJCQlwb2x5SW50cy5zb3J0KGlu dGVnZXJfY29tcGFyZSk7DQoJCQlmb3IgKGkgPSAwOyBpIDwgaW50czsgaSs9MikN CgkJCQl0aGlzLm1rRGl2KHBvbHlJbnRzW2ldLCB5LCBwb2x5SW50c1tpKzFdLXBv bHlJbnRzW2ldKzEsIDEpOw0KCQl9DQoJfTsNCg0KDQoJdGhpcy5kcmF3U3RyaW5n ID0gZnVuY3Rpb24odHh0LCB4LCB5KQ0KCXsNCgkJdGhpcy5odG0gKz0gJzxkaXYg c3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3doaXRlLXNwYWNlOm5vd3JhcDsnKw0K CQkJJ2xlZnQ6JyArIHggKyAncHg7JysNCgkJCSd0b3A6JyArIHkgKyAncHg7JysN CgkJCSdmb250LWZhbWlseTonICsgIHRoaXMuZnRGYW0gKyAnOycrDQoJCQknZm9u dC1zaXplOicgKyB0aGlzLmZ0U3ogKyAnOycrDQoJCQknY29sb3I6JyArIHRoaXMu Y29sb3IgKyAnOycgKyB0aGlzLmZ0U3R5ICsgJyI+JysNCgkJCXR4dCArDQoJCQkn PFwvZGl2Pic7DQoJfTsNCg0KDQovKiBkcmF3U3RyaW5nUmVjdCgpIGFkZGVkIGJ5 IFJpY2sgQmxvbW1lcnMuDQpBbGxvd3MgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0 aGUgdGV4dCByZWN0YW5nbGUgYW5kIHRvIGFsaWduIHRoZQ0KdGV4dCBib3RoIGhv cml6b250YWxseSAoZS5nLiByaWdodCkgYW5kIHZlcnRpY2FsbHkgd2l0aGluIHRo YXQgcmVjdGFuZ2xlICovDQoJdGhpcy5kcmF3U3RyaW5nUmVjdCA9IGZ1bmN0aW9u KHR4dCwgeCwgeSwgd2lkdGgsIGhhbGlnbikNCgl7DQoJCXRoaXMuaHRtICs9ICc8 ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47JysN CgkJCSdsZWZ0OicgKyB4ICsgJ3B4OycrDQoJCQkndG9wOicgKyB5ICsgJ3B4Oycr DQoJCQknd2lkdGg6Jyt3aWR0aCArJ3B4OycrDQoJCQkndGV4dC1hbGlnbjonK2hh bGlnbisnOycrDQoJCQknZm9udC1mYW1pbHk6JyArICB0aGlzLmZ0RmFtICsgJzsn Kw0KCQkJJ2ZvbnQtc2l6ZTonICsgdGhpcy5mdFN6ICsgJzsnKw0KCQkJJ2NvbG9y OicgKyB0aGlzLmNvbG9yICsgJzsnICsgdGhpcy5mdFN0eSArICciPicrDQoJCQl0 eHQgKw0KCQkJJzxcL2Rpdj4nOw0KCX07DQoNCg0KCXRoaXMuZHJhd0ltYWdlID0g ZnVuY3Rpb24oaW1nU3JjLCB4LCB5LCB3LCBoLCBhKQ0KCXsNCgkJdGhpcy5odG0g Kz0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOycrDQoJCQknbGVmdDon ICsgeCArICdweDsnKw0KCQkJJ3RvcDonICsgeSArICdweDsnKw0KCQkJJ3dpZHRo OicgKyAgdyArICc7JysNCgkJCSdoZWlnaHQ6JyArIGggKyAnOyI+JysNCgkJCSc8 aW1nIHNyYz0iJyArIGltZ1NyYyArICciIHdpZHRoPSInICsgdyArICciIGhlaWdo dD0iJyArIGggKyAnIicgKyAoYT8gKCcgJythKSA6ICcnKSArICc+JysNCgkJCSc8 XC9kaXY+JzsNCgl9Ow0KDQoNCgl0aGlzLmNsZWFyID0gZnVuY3Rpb24oKQ0KCXsN CgkJdGhpcy5odG0gPSAiIjsNCgkJaWYgKHRoaXMuY252KSB0aGlzLmNudi5pbm5l ckhUTUwgPSB0aGlzLmRlZmh0bTsNCgl9Ow0KDQoNCgl0aGlzLm1rT3ZRZHMgPSBm dW5jdGlvbihjeCwgY3ksIHhsLCB4ciwgeXQsIHliLCB3LCBoKQ0KCXsNCgkJdGhp cy5ta0Rpdih4citjeCwgeXQrY3ksIHcsIGgpOw0KCQl0aGlzLm1rRGl2KHhyK2N4 LCB5YitjeSwgdywgaCk7DQoJCXRoaXMubWtEaXYoeGwrY3gsIHliK2N5LCB3LCBo KTsNCgkJdGhpcy5ta0Rpdih4bCtjeCwgeXQrY3ksIHcsIGgpOw0KCX07DQoNCgl0 aGlzLnNldFN0cm9rZSgxKTsNCgl0aGlzLnNldEZvbnQoJ3ZlcmRhbmEsZ2VuZXZh LGhlbHZldGljYSxzYW5zLXNlcmlmJywgU3RyaW5nLmZyb21DaGFyQ29kZSgweDMx LCAweDMyLCAweDcwLCAweDc4KSwgRm9udC5QTEFJTik7DQoJdGhpcy5jb2xvciA9 ICcjMDAwMDAwJzsNCgl0aGlzLmh0bSA9ICcnOw0KCXRoaXMud25kID0gd25kIHx8 IHdpbmRvdzsNCg0KCWlmICghKGpnX2llIHx8IGpnX2RvbSB8fCBqZ19paHRtKSkg Y2hrREhUTSgpOw0KCWlmICh0eXBlb2YgaWQgIT0gJ3N0cmluZycgfHwgIWlkKSB0 aGlzLnBhaW50ID0gcG50RG9jOw0KCWVsc2UNCgl7DQoJCXRoaXMuY252ID0gZG9j dW1lbnQuYWxsPyAodGhpcy53bmQuZG9jdW1lbnQuYWxsW2lkXSB8fCBudWxsKQ0K CQkJOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZD8gKHRoaXMud25kLmRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBudWxsKQ0KCQkJOiBudWxsOw0KCQl0aGlz LmRlZmh0bSA9ICh0aGlzLmNudiAmJiB0aGlzLmNudi5pbm5lckhUTUwpPyB0aGlz LmNudi5pbm5lckhUTUwgOiAnJzsNCgkJdGhpcy5wYWludCA9IGpnX2RvbT8gcG50 Q252RG9tIDogamdfaWU/IHBudENudkllIDogamdfaWh0bT8gcG50Q252SWh0bSA6 IHBudENudjsNCgl9DQoNCgl0aGlzLnNldFByaW50YWJsZShmYWxzZSk7DQp9DQoN Cg0KDQpmdW5jdGlvbiBpbnRlZ2VyX2NvbXBhcmUoeCx5KQ0Kew0KCXJldHVybiAo eCA8IHkpID8gLTEgOiAoKHggPiB5KSoxKTsNCn0NCg0K whiteboard.ico AAABAAIAICAAAAAAAACoCAAAJgAAABAQAAAAAAAAaAUAAM4IAAAoAAAAIAAAAEAA AAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAA AACAAIAAgIAAAMDAwADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIi IgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/szADG1u8A1ufnAJCp rQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMA zAAzAP8AMzMAADMzMwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNm zAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPMMwAzzGYAM8yZADPM zAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/ MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkz zACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ /wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/ /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzM AADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwA MwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9m mQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP// ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx 8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AFBQ UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUPP09HhQmPPz8/Mb8/Tz8/Pz 8/Pz8/PzG/Pz83hQmVBQ8/P1eEqY8/Tz8xvz9PTz9PPz8/T09PPz9PQbeFAIUFD0 8/V4Spjz8/Pz8/T09PPz8/T09PT19PT19PN4UAhQUPTz9XhKmPP09PT19fT19PMb G/DwCAiZmZmYeFBQCFBQ8/P1eEpQmJmYmHh4eFBQUFBQUFBQUFBQUEpKUFAIUFDz 8/V4SlBQUFBQSkpKSkpKSkpKSkpKSkpKSkpQUAhQUPPz9XhKSkpKUEpKSkpQUFBQ UFBQUFBQUFBQUFBQCFBQ8/P1eEpKUFBQUFBQUHh4eHh4mJiZmZmZmZl4UFAIUFD0 8/V4SlCYmZmZmZmZCAgICAgICAgICAgI8JhQUAhQUPTz9XhKUJgICJmZmQgICAgI CAgICAgICAjwmFBQCFBQ9PP1eEpQmAgImQgICJmZmZmZmZmZmZmZmQiYUFAIUFDz 8/V4SlCYmQgICAiZmZmZmZmZmZmZmZmYmZhQUAhQUPTz9XhKUJiZCAiYmJmYmJiY mJiYmJiYmZkIeFBQCFBQ9PP1eEpQmJmZeFBQUFBQUFBQUFBQUFCYmQiYUFAIUFD0 8/V4SlCYmZmZmJiYmJiYmJiYmJiYmQiZmZhQUAhQUPTz9XhKUJgImXh4eHh4eHh4 eHh4eHh4mJmZeFBQCFBQ8/P1eEpQmAiYUFBQUFBQUFBQUFBQUFB4mQh4UHgbUFAb 8/SZUFCYmZmYmJh4eJiZCJkICAgICAiZmXh49PRQUPPz8/XwUJiZmFBQUFBQeJiZ mQiZCJkImZkIeHjz9FBQ9PPz9PBQmAgImJmZmJiYCAgICAgImQiZmQh4ePP0UFD0 8/P0CFCYmZl4eHh4eHh4eHiYCAiZmZmZmXh48/RQUPTz8/TwUJiZmHhQUFBQUFBQ eJgICJmZmZmZeHjz9FBQ8/Pz9AhQmJiZmJmYmJmZmZmZCAgICAgICAh4eBv0UFDz 8/P0CFCYmJmYmZiYmZmZmZmZmZmZmZmZmXh4G/RQUPPz8/TwUFBQUFBQUFBQUFBQ UFBQUFBQUFBQUHjz9FBQ8/Pz9POYeHh4eHh4eHh4eHh4eHh4eHh4eHh4CPTzUFD0 8/Pz8/T09PT09PT09PT09PT09PT09PT09PT08/NQUPPz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz9PPz8/Pz9PPz81BQ8/Tz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PzUFAb 9PPz8/Pz8/T09PPz8/Pz8/Pz8/Pz8/Pz8/P09PNQUFBQUFBQUFBQUFBQUFBQUFBQ UFBQUFBQUFBQUFBQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA AAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYW FgAcHBwAIiIiACkpKQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW 7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAAzAAAMwAAADMzAAAzZgAAM5kAADPMAAAz /wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZZgAAmZkAAJnMAACZ /wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNm ZgAzZpkAM2bMADNm/wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPM ZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/mQAz/8wAM///AGYAAABmADMAZgBmAGYA mQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZmAABmZjMAZmZmAGZm mQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkz MwCZAGYAmTPMAJkA/wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZ mQCZmcwAmZn/AJnMAACZzDMAZsxmAJnMmQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/ mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwzMwDMM2YAzDOZAMwz zADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/ zADM//8AzAAzAP8AZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9m MwDMZmYA/2aZAP9mzADMZv8A/5kAAP+ZMwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/M MwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm/wBm/2YAZv//AP9m ZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj 4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP// AAD///8Ac5hQeJgcHBwcHJgcHBxycpj/cgj/9v/////////2eHOY9nKYCAgImJiY eHhzcnJ4mPZySVBJSUlJSkpKUFByeJj2clB4eHiYmJiZCAiYcniY9nJ4CAgICAgI CAgImXJ4mPZycgiZmJiYmJiYmZhyeJj2cnIIeHN4eHh4eJmYcniY9nJ4mXh4eHh4 eHiZmHN4HPaZeJl4eHiZmZmZCJgImJj/G3iZeHh4mJkICAiYCJiY/wh4mZh4eHiZ CAgImAiYHPbweHh4eHh4eHh4eHgImJj18wiZCAgICJmZmZkI85iY//X///////// //////+YcpiYHJiYHBwcmJiYmJiYcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=