planet-positions.js 197 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857
  1. (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){
  2. 'use strict';
  3. var SolarSystem = require('./SolarSystem');
  4. var global = window.lagrange = window.lagrange || {};
  5. global.planet_positions = module.exports = {
  6. getPositions: function(userDate){
  7. return SolarSystem.getPositions(userDate);
  8. }
  9. };
  10. },{"./SolarSystem":8}],2:[function(require,module,exports){
  11. 'use strict';
  12. var OrbitalElements = require('./OrbitalElements');
  13. var ns = require('ns');
  14. var THREE = require('./Three.shim');
  15. var CelestialBody = {
  16. init : function() {
  17. this.reset();
  18. this.movement = new THREE.Vector3();
  19. this.invMass = 1 / this.mass;
  20. this.orbitalElements = Object.create(OrbitalElements);
  21. this.orbitalElements.setName(this.name);
  22. this.orbitalElements.setDefaultOrbit(this.orbit, this.orbitCalculator);
  23. //console.log(this.name, this.position, this.velocity);
  24. },
  25. reset : function(){
  26. this.angle = 0;
  27. this.force = new THREE.Vector3();
  28. this.movement = new THREE.Vector3();
  29. this.previousPosition = null;
  30. },
  31. //if epoch start is not j2000, get epoch time from j2000 epoch time
  32. getEpochTime : function(epochTime) {
  33. if(this.epoch) {
  34. epochTime = epochTime - ((this.epoch.getTime() - ns.J2000) / 1000);
  35. }
  36. return epochTime;
  37. },
  38. setPositionFromDate : function(epochTime, calculateVelocity) {
  39. epochTime = this.getEpochTime(epochTime);
  40. this.position = this.isCentral ? new THREE.Vector3() : this.orbitalElements.getPositionFromElements(this.orbitalElements.calculateElements(epochTime));
  41. this.relativePosition = new THREE.Vector3();
  42. if(calculateVelocity) {
  43. this.velocity = this.isCentral ? new THREE.Vector3() : this.orbitalElements.calculateVelocity(epochTime, this.relativeTo, this.calculateFromElements);
  44. }
  45. this.positionRelativeTo();
  46. },
  47. getAngleTo : function(bodyName){
  48. var ref = require('./SolarSystem').getBody(bodyName);
  49. if(ref) {
  50. var eclPos = this.position.clone().sub(ref.getPosition()).normalize();
  51. eclPos.z = 0;
  52. var angleX = eclPos.angleTo(new THREE.Vector3(1, 0, 0));
  53. var angleY = eclPos.angleTo(new THREE.Vector3(0, 1, 0));
  54. //console.log(angleX, angleY);
  55. var angle = angleX;
  56. var q = Math.PI / 2;
  57. if(angleY > q) angle = -angleX;
  58. return angle;
  59. }
  60. return 0;
  61. },
  62. positionRelativeTo : function(){
  63. if(this.relativeTo) {
  64. var central = require('./SolarSystem').getBody(this.relativeTo);
  65. if(central && central!==require('./SolarSystem').getBody()/**/) {
  66. this.position.add(central.position);
  67. //console.log(this.name+' pos rel to ' + this.relativeTo);
  68. this.velocity && central.velocity && this.velocity.add(central.velocity);
  69. }
  70. }
  71. },
  72. calculatePosition : function(t) {
  73. return this.orbitalElements.calculatePosition(t);
  74. },
  75. getPosition : function(){
  76. return this.position.clone();
  77. },
  78. getVelocity : function(){
  79. return this.velocity && this.velocity.clone();
  80. },
  81. //return true/false if this body is orbiting the requested body
  82. isOrbitAround : function(celestial){
  83. return celestial.name === this.relativeTo;
  84. }
  85. };
  86. module.exports = CelestialBody;
  87. },{"./OrbitalElements":7,"./SolarSystem":8,"./Three.shim":9,"ns":6}],3:[function(require,module,exports){
  88. 'use strict';
  89. var ns = require('ns');
  90. var MoonRealOrbit = require('./MoonRealOrbit');
  91. module.exports = [
  92. {
  93. name: 'sun',
  94. title : 'The Sun',
  95. mass : 1.9891e30,
  96. radius : 6.96342e5,
  97. k : 0.01720209895 //gravitational constant (μ)
  98. },
  99. {
  100. name: 'mercury',
  101. title : 'Mercury',
  102. mass : 3.3022e23,
  103. radius:2439,
  104. orbit : {
  105. base : {a : 0.38709927 * ns.AU , e : 0.20563593, i: 7.00497902, l : 252.25032350, lp : 77.45779628, o : 48.33076593},
  106. cy : {a : 0.00000037 * ns.AU , e : 0.00001906, i: -0.00594749, l : 149472.67411175, lp : 0.16047689, o : -0.12534081}
  107. }
  108. },
  109. {
  110. name: 'venus',
  111. title : 'Venus',
  112. mass : 4.868e24,
  113. radius : 6051,
  114. orbit : {
  115. base : {a : 0.72333566 * ns.AU , e : 0.00677672, i: 3.39467605, l : 181.97909950, lp : 131.60246718, o : 76.67984255},
  116. cy : {a : 0.00000390 * ns.AU , e : -0.00004107, i: -0.00078890, l : 58517.81538729, lp : 0.00268329, o : -0.27769418}
  117. }
  118. },
  119. {
  120. name:'earth',
  121. title : 'The Earth',
  122. mass : 5.9736e24,
  123. radius : 3443.9307 * ns.NM_TO_KM,
  124. sideralDay : ns.SIDERAL_DAY,
  125. tilt : 23+(26/60)+(21/3600) ,
  126. orbit : {
  127. base : {a : 1.00000261 * ns.AU, e : 0.01671123, i : -0.00001531, l : 100.46457166, lp : 102.93768193, o : 0.0},
  128. cy : {a : 0.00000562 * ns.AU, e : -0.00004392, i : -0.01294668, l : 35999.37244981, lp : 0.32327364, o : 0.0}
  129. }
  130. },
  131. {
  132. name:'mars',
  133. title : 'Mars',
  134. mass : 6.4185e23,
  135. radius : 3376,
  136. sideralDay : 1.025957 * ns.DAY,
  137. orbit : {
  138. base : {a : 1.52371034 * ns.AU , e : 0.09339410, i: 1.84969142, l : -4.55343205, lp : -23.94362959, o : 49.55953891},
  139. cy : {a : 0.00001847 * ns.AU , e : 0.00007882, i: -0.00813131, l : 19140.30268499, lp : 0.44441088, o : -0.29257343}
  140. }
  141. },
  142. {
  143. name:'jupiter',
  144. title : 'Jupiter',
  145. mass : 1.8986e27,
  146. radius : 71492,
  147. orbit : {
  148. base : {a : 5.20288700 * ns.AU , e : 0.04838624, i: 1.30439695, l : 34.39644051, lp : 14.72847983, o : 100.47390909},
  149. cy : {a : -0.00011607 * ns.AU , e : -0.00013253, i: -0.00183714, l : 3034.74612775, lp : 0.21252668, o : 0.20469106}
  150. }
  151. },
  152. {
  153. name:'saturn',
  154. title : 'Saturn',
  155. mass : 5.6846e26,
  156. radius : 58232,
  157. tilt : 26.7,
  158. orbit : {
  159. base : {a : 9.53667594 * ns.AU , e : 0.05386179, i: 2.48599187, l : 49.95424423, lp : 92.59887831, o : 113.66242448},
  160. cy : {a : -0.00125060 * ns.AU , e : -0.00050991, i: 0.00193609, l : 1222.49362201, lp : -0.41897216, o : -0.28867794}
  161. }
  162. },
  163. {
  164. name: 'uranus',
  165. title : 'Uranus',
  166. mass : 8.6810e25,
  167. radius : 25559,
  168. orbit : {
  169. base : {a : 19.18916464 * ns.AU , e : 0.04725744, i: 0.77263783, l : 313.23810451, lp : 170.95427630, o : 74.01692503},
  170. cy : {a : -0.00196176 * ns.AU , e : -0.00004397, i: -0.00242939, l : 428.48202785, lp : 0.40805281, o : 0.04240589}
  171. }
  172. },
  173. {
  174. name:'neptune',
  175. title : 'Neptune',
  176. mass : 1.0243e26,
  177. radius : 24764,
  178. orbit : {
  179. base : {a : 30.06992276 * ns.AU, e : 0.00859048, i: 1.77004347, l : -55.12002969, lp : 44.96476227, o : 131.78422574},
  180. cy : {a : 0.00026291 * ns.AU, e : 0.00005105, i: 0.00035372, l : 218.45945325, lp : -0.32241464, o : -0.00508664}
  181. }
  182. },
  183. {
  184. name: 'pluto',
  185. title : 'Pluto',
  186. mass : 1.305e22+1.52e21,
  187. radius : 1153,
  188. orbit : {
  189. base : {a : 39.48211675 * ns.AU , e : 0.24882730, i: 17.14001206, l : 238.92903833, lp : 224.06891629, o : 110.30393684},
  190. cy : {a : -0.00031596 * ns.AU , e : 0.00005170, i: 0.00004818, l : 145.20780515, lp : -0.04062942, o : -0.01183482}
  191. }
  192. },
  193. {
  194. name: 'halley',
  195. title : 'Halley\'s Comet',
  196. mass : 2.2e14,
  197. radius : 50,
  198. orbit : {
  199. base : {a : 17.83414429 * ns.AU , e : 0.967142908, i: 162.262691, M : 360 * (438393600 / (75.1 * ns.YEAR * ns.DAY)), w : 111.332485, o : 58.420081},
  200. day : {a : 0 , e : 0, i: 0, M : (360 / (75.1 * 365.25) ), w : 0, o : 0}
  201. }
  202. },
  203. {
  204. name: 'moon',
  205. title : 'The Moon',
  206. mass : 7.3477e22,
  207. radius : 1738.1,
  208. sideralDay : (27.3215782 * ns.DAY) ,
  209. tilt : 1.5424,
  210. fov : 1,
  211. relativeTo : 'earth',
  212. orbitCalculator : MoonRealOrbit,
  213. orbit: {
  214. base : {
  215. a : 384400,
  216. e : 0.0554,
  217. w : 318.15,
  218. M : 135.27,
  219. i : 5.16,
  220. o : 125.08
  221. },
  222. day : {
  223. a : 0,
  224. e : 0,
  225. i : 0,
  226. M : 13.176358,//360 / 27.321582,
  227. w : (360 / 5.997) / 365.25,
  228. o : (360 / 18.600) / 365.25
  229. }
  230. }
  231. }
  232. ];
  233. },{"./MoonRealOrbit":5,"ns":6}],4:[function(require,module,exports){
  234. 'use strict';
  235. module.exports = {
  236. sinh : function(a) {
  237. return (Math.exp(a) - Math.exp(-a)) / 2;
  238. },
  239. cosh : function(a) {
  240. return (Math.pow(Math.E, a) + Math.pow(Math.E, -a)) / 2;
  241. },
  242. sign : function(a) {
  243. return (a >= 0.0) ? 1 : -1;
  244. }
  245. };
  246. },{}],5:[function(require,module,exports){
  247. 'use strict';
  248. var ns = require('ns');
  249. var DEG_TO_RAD = ns.DEG_TO_RAD;
  250. var RAD_TO_DEG = ns.RAD_TO_DEG;
  251. module.exports = function(t){
  252. var t2 = t * t;
  253. var t3 = t * t2;
  254. var t4 = t * t3;
  255. var t5 = t * t4;
  256. var t2e4 = t2 * 1e-4;
  257. var t3e6 = t3 * 1e-6;
  258. var t4e8 = t4 * 1e-8;
  259. //% semimajor axis
  260. var sa = 3400.4 * Math.cos(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  261. + 3.664 * t3e6 - 1.769 * t4e8))
  262. - 635.6 * Math.cos(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  263. - 10.684 * t3e6 + 5.028 * t4e8))
  264. - 235.6 * Math.cos(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  265. + 14.348 * t3e6 - 6.797 * t4e8))
  266. + 218.1 * Math.cos(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  267. + 3.623 * t3e6 - 1.769 * t4e8))
  268. + 181.0 * Math.cos(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  269. + 18.011 * t3e6 - 8.566 * t4e8))
  270. - 39.9 * Math.cos(DEG_TO_RAD * (103.2079 + 377336.3051 * t - 121.035 * t2e4
  271. - 10.724 * t3e6 + 5.028 * t4e8))
  272. - 38.4 * Math.cos(DEG_TO_RAD * (233.2295 + 926533.2733 * t - 34.136 * t2e4
  273. + 3.705 * t3e6 - 1.769 * t4e8))
  274. + 33.8 * Math.cos(DEG_TO_RAD * (336.4374 + 1303869.5784 * t - 155.171 * t2e4
  275. - 7.020 * t3e6 + 3.259 * t4e8))
  276. + 28.8 * Math.cos(DEG_TO_RAD * (111.4008 + 1781068.4461 * t - 65.201 * t2e4
  277. + 7.328 * t3e6 - 3.538 * t4e8))
  278. + 12.6 * Math.cos(DEG_TO_RAD * (13.1347 + 1331734.0404 * t + 58.906 * t2e4
  279. + 17.971 * t3e6 - 8.566 * t4e8))
  280. + 11.4 * Math.cos(DEG_TO_RAD * (186.5442 + 966404.0351 * t - 68.058 * t2e4
  281. - 0.567 * t3e6 + 0.232 * t4e8))
  282. - 11.1 * Math.cos(DEG_TO_RAD * (222.5657 - 441199.8173 * t - 91.506 * t2e4
  283. - 14.307 * t3e6 + 6.797 * t4e8))
  284. - 10.2 * Math.cos(DEG_TO_RAD * (269.9268 + 954397.7353 * t + 179.941 * t2e4
  285. + 28.695 * t3e6 - 13.594 * t4e8))
  286. + 9.7 * Math.cos(DEG_TO_RAD * (145.6272 + 1844931.9583 * t + 147.340 * t2e4
  287. + 32.359 * t3e6 - 15.363 * t4e8))
  288. + 9.6 * Math.cos(DEG_TO_RAD * (240.6422 + 818536.1225 * t - 29.529 * t2e4
  289. + 3.582 * t3e6 - 1.769 * t4e8))
  290. + 8.0 * Math.cos(DEG_TO_RAD * (297.8502 + 445267.1115 * t - 16.300 * t2e4
  291. + 1.832 * t3e6 - 0.884 * t4e8))
  292. - 6.2 * Math.cos(DEG_TO_RAD * (132.4925 + 513197.9179 * t + 88.434 * t2e4
  293. + 14.388 * t3e6 - 6.797 * t4e8))
  294. + 6.0 * Math.cos(DEG_TO_RAD * (173.5506 + 1335801.3346 * t - 48.901 * t2e4
  295. + 5.496 * t3e6 - 2.653 * t4e8))
  296. + 3.7 * Math.cos(DEG_TO_RAD * (113.8717 + 1745069.3958 * t - 63.665 * t2e4
  297. + 7.287 * t3e6 - 3.538 * t4e8))
  298. + 3.6 * Math.cos(DEG_TO_RAD * (338.9083 + 1267870.5281 * t - 153.636 * t2e4
  299. - 7.061 * t3e6 + 3.259 * t4e8))
  300. + 3.2 * Math.cos(DEG_TO_RAD * (246.3642 + 2258267.3137 * t + 24.769 * t2e4
  301. + 21.675 * t3e6 - 10.335 * t4e8))
  302. - 3.0 * Math.cos(DEG_TO_RAD * (8.1929 + 1403732.1410 * t + 55.834 * t2e4
  303. + 18.052 * t3e6 - 8.566 * t4e8))
  304. + 2.3 * Math.cos(DEG_TO_RAD * (98.2661 + 449334.4057 * t - 124.107 * t2e4
  305. - 10.643 * t3e6 + 5.028 * t4e8))
  306. - 2.2 * Math.cos(DEG_TO_RAD * (357.5291 + 35999.0503 * t - 1.536 * t2e4
  307. + 0.041 * t3e6 + 0.000 * t4e8))
  308. - 2.0 * Math.cos(DEG_TO_RAD * (38.5872 + 858602.4669 * t - 138.871 * t2e4
  309. - 8.852 * t3e6 + 4.144 * t4e8))
  310. - 1.8 * Math.cos(DEG_TO_RAD * (105.6788 + 341337.2548 * t - 119.499 * t2e4
  311. - 10.765 * t3e6 + 5.028 * t4e8))
  312. - 1.7 * Math.cos(DEG_TO_RAD * (201.4740 + 826670.7108 * t - 245.142 * t2e4
  313. - 21.367 * t3e6 + 10.057 * t4e8))
  314. + 1.6 * Math.cos(DEG_TO_RAD * (184.1196 + 401329.0556 * t + 125.428 * t2e4
  315. + 18.579 * t3e6 - 8.798 * t4e8))
  316. - 1.4 * Math.cos(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  317. + 14.915 * t3e6 - 7.029 * t4e8))
  318. + 1.3 * Math.cos(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  319. - 25.031 * t3e6 + 11.826 * t4e8));
  320. var sapp = - 0.55 * Math.cos(DEG_TO_RAD * (238.2 + 854535.2 * t))
  321. + 0.10 * Math.cos(DEG_TO_RAD * (103.2 + 377336.3 * t))
  322. + 0.10 * Math.cos(DEG_TO_RAD * (233.2 + 926533.3 * t));
  323. var sma = 383397.6 + sa + sapp * t;
  324. //% orbital eccentricity
  325. var se = 0.014217 * Math.cos(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  326. - 10.684 * t3e6 + 5.028 * t4e8))
  327. + 0.008551 * Math.cos(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  328. - 25.031 * t3e6 + 11.826 * t4e8))
  329. - 0.001383 * Math.cos(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  330. + 14.348 * t3e6 - 6.797 * t4e8))
  331. + 0.001353 * Math.cos(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  332. + 18.011 * t3e6 - 8.566 * t4e8))
  333. - 0.001146 * Math.cos(DEG_TO_RAD * (66.5106 + 349471.8432 * t - 335.112 * t2e4
  334. - 35.715 * t3e6 + 16.854 * t4e8))
  335. - 0.000915 * Math.cos(DEG_TO_RAD * (201.4740 + 826670.7108 * t - 245.142 * t2e4
  336. - 21.367 * t3e6 + 10.057 * t4e8))
  337. + 0.000869 * Math.cos(DEG_TO_RAD * (103.2079 + 377336.3051 * t - 121.035 * t2e4
  338. - 10.724 * t3e6 + 5.028 * t4e8))
  339. - 0.000628 * Math.cos(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  340. + 3.664 * t3e6 - 1.769 * t4e8))
  341. - 0.000393 * Math.cos(DEG_TO_RAD * (291.5472 - 127727.0245 * t - 425.082 * t2e4
  342. - 50.062 * t3e6 + 23.651 * t4e8))
  343. + 0.000284 * Math.cos(DEG_TO_RAD * (328.2445 - 99862.5625 * t - 211.005 * t2e4
  344. - 25.072 * t3e6 + 11.826 * t4e8))
  345. - 0.000278 * Math.cos(DEG_TO_RAD * (162.8868 - 31931.7561 * t - 106.271 * t2e4
  346. - 12.516 * t3e6 + 5.913 * t4e8))
  347. - 0.000240 * Math.cos(DEG_TO_RAD * (269.9268 + 954397.7353 * t + 179.941 * t2e4
  348. + 28.695 * t3e6 - 13.594 * t4e8))
  349. + 0.000230 * Math.cos(DEG_TO_RAD * (111.4008 + 1781068.4461 * t - 65.201 * t2e4
  350. + 7.328 * t3e6 - 3.538 * t4e8))
  351. + 0.000229 * Math.cos(DEG_TO_RAD * (167.2476 + 762807.1986 * t - 457.683 * t2e4
  352. - 46.398 * t3e6 + 21.882 * t4e8))
  353. - 0.000202 * Math.cos(DEG_TO_RAD * ( 83.3826 - 12006.2998 * t + 247.999 * t2e4
  354. + 29.262 * t3e6 - 13.826 * t4e8))
  355. + 0.000190 * Math.cos(DEG_TO_RAD * (190.8102 - 541062.3799 * t - 302.511 * t2e4
  356. - 39.379 * t3e6 + 18.623 * t4e8))
  357. + 0.000177 * Math.cos(DEG_TO_RAD * (357.5291 + 35999.0503 * t - 1.536 * t2e4
  358. + 0.041 * t3e6 + 0.000 * t4e8))
  359. + 0.000153 * Math.cos(DEG_TO_RAD * (32.2842 + 285608.3309 * t - 547.653 * t2e4
  360. - 60.746 * t3e6 + 28.679 * t4e8))
  361. - 0.000137 * Math.cos(DEG_TO_RAD * (44.8902 + 1431596.6029 * t + 269.911 * t2e4
  362. + 43.043 * t3e6 - 20.392 * t4e8))
  363. + 0.000122 * Math.cos(DEG_TO_RAD * (145.6272 + 1844931.9583 * t + 147.340 * t2e4
  364. + 32.359 * t3e6 - 15.363 * t4e8))
  365. + 0.000116 * Math.cos(DEG_TO_RAD * (302.2110 + 1240006.0662 * t - 367.713 * t2e4
  366. - 32.051 * t3e6 + 15.085 * t4e8))
  367. - 0.000111 * Math.cos(DEG_TO_RAD * (203.9449 + 790671.6605 * t - 243.606 * t2e4
  368. - 21.408 * t3e6 + 10.057 * t4e8))
  369. - 0.000108 * Math.cos(DEG_TO_RAD * (68.9815 + 313472.7929 * t - 333.576 * t2e4
  370. - 35.756 * t3e6 + 16.854 * t4e8))
  371. + 0.000096 * Math.cos(DEG_TO_RAD * (336.4374 + 1303869.5784 * t - 155.171 * t2e4
  372. - 7.020 * t3e6 + 3.259 * t4e8))
  373. - 0.000090 * Math.cos(DEG_TO_RAD * (98.2661 + 449334.4057 * t - 124.107 * t2e4
  374. - 10.643 * t3e6 + 5.028 * t4e8))
  375. + 0.000090 * Math.cos(DEG_TO_RAD * (13.1347 + 1331734.0404 * t + 58.906 * t2e4
  376. + 17.971 * t3e6 - 8.566 * t4e8))
  377. + 0.000056 * Math.cos(DEG_TO_RAD * (55.8468 - 1018261.2475 * t - 392.482 * t2e4
  378. - 53.726 * t3e6 + 25.420 * t4e8))
  379. - 0.000056 * Math.cos(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  380. + 3.623 * t3e6 - 1.769 * t4e8))
  381. + 0.000052 * Math.cos(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  382. + 14.915 * t3e6 - 7.029 * t4e8))
  383. - 0.000050 * Math.cos(DEG_TO_RAD * (133.0212 + 698943.6863 * t - 670.224 * t2e4
  384. - 71.429 * t3e6 + 33.708 * t4e8))
  385. - 0.000049 * Math.cos(DEG_TO_RAD * (267.9846 + 1176142.5540 * t - 580.254 * t2e4
  386. - 57.082 * t3e6 + 26.911 * t4e8))
  387. - 0.000049 * Math.cos(DEG_TO_RAD * (184.1196 + 401329.0556 * t + 125.428 * t2e4
  388. + 18.579 * t3e6 - 8.798 * t4e8))
  389. - 0.000045 * Math.cos(DEG_TO_RAD * (49.1562 - 75869.8120 * t + 35.458 * t2e4
  390. + 4.231 * t3e6 - 2.001 * t4e8))
  391. + 0.000044 * Math.cos(DEG_TO_RAD * (257.3208 - 191590.5367 * t - 637.623 * t2e4
  392. - 75.093 * t3e6 + 35.477 * t4e8))
  393. + 0.000042 * Math.cos(DEG_TO_RAD * (105.6788 + 341337.2548 * t - 119.499 * t2e4
  394. - 10.765 * t3e6 + 5.028 * t4e8))
  395. + 0.000042 * Math.cos(DEG_TO_RAD * (160.4159 + 4067.2942 * t - 107.806 * t2e4
  396. - 12.475 * t3e6 + 5.913 * t4e8))
  397. + 0.000040 * Math.cos(DEG_TO_RAD * (246.3642 + 2258267.3137 * t + 24.769 * t2e4
  398. + 21.675 * t3e6 - 10.335 * t4e8))
  399. - 0.000040 * Math.cos(DEG_TO_RAD * (156.5838 - 604925.8921 * t - 515.053 * t2e4
  400. - 64.410 * t3e6 + 30.448 * t4e8))
  401. + 0.000036 * Math.cos(DEG_TO_RAD * (169.7185 + 726808.1483 * t - 456.147 * t2e4
  402. - 46.439 * t3e6 + 21.882 * t4e8))
  403. + 0.000029 * Math.cos(DEG_TO_RAD * (113.8717 + 1745069.3958 * t - 63.665 * t2e4
  404. + 7.287 * t3e6 - 3.538 * t4e8))
  405. - 0.000029 * Math.cos(DEG_TO_RAD * (297.8502 + 445267.1115 * t - 16.300 * t2e4
  406. + 1.832 * t3e6 - 0.884 * t4e8))
  407. - 0.000028 * Math.cos(DEG_TO_RAD * (294.0181 - 163726.0747 * t - 423.546 * t2e4
  408. - 50.103 * t3e6 + 23.651 * t4e8))
  409. + 0.000027 * Math.cos(DEG_TO_RAD * (263.6238 + 381403.5993 * t - 228.841 * t2e4
  410. - 23.199 * t3e6 + 10.941 * t4e8))
  411. - 0.000026 * Math.cos(DEG_TO_RAD * (358.0578 + 221744.8187 * t - 760.194 * t2e4
  412. - 85.777 * t3e6 + 40.505 * t4e8))
  413. - 0.000026 * Math.cos(DEG_TO_RAD * (8.1929 + 1403732.1410 * t + 55.834 * t2e4
  414. + 18.052 * t3e6 - 8.566 * t4e8));
  415. var sedp = -0.0022 * Math.cos(DEG_TO_RAD * (103.2 + 377336.3 * t));
  416. var ecc = 0.055544 + se + 1e-3 * t * sedp;
  417. //% sine of half the inclination
  418. var sg = 0.0011776 * Math.cos(DEG_TO_RAD * (49.1562 - 75869.8120 * t + 35.458 * t2e4
  419. + 4.231 * t3e6 - 2.001 * t4e8))
  420. - 0.0000971 * Math.cos(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  421. + 3.664 * t3e6 - 1.769 * t4e8))
  422. + 0.0000908 * Math.cos(DEG_TO_RAD * (186.5442 + 966404.0351 * t - 68.058 * t2e4
  423. - 0.567 * t3e6 + 0.232 * t4e8))
  424. + 0.0000623 * Math.cos(DEG_TO_RAD * (83.3826 - 12006.2998 * t + 247.999 * t2e4
  425. + 29.262 * t3e6 - 13.826 * t4e8))
  426. + 0.0000483 * Math.cos(DEG_TO_RAD * (51.6271 - 111868.8623 * t + 36.994 * t2e4
  427. + 4.190 * t3e6 - 2.001 * t4e8))
  428. + 0.0000348 * Math.cos(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  429. - 10.684 * t3e6 + 5.028 * t4e8))
  430. - 0.0000316 * Math.cos(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  431. + 14.915 * t3e6 - 7.029 * t4e8))
  432. - 0.0000253 * Math.cos(DEG_TO_RAD * (46.6853 - 39870.7617 * t + 33.922 * t2e4
  433. + 4.272 * t3e6 - 2.001 * t4e8))
  434. - 0.0000141 * Math.cos(DEG_TO_RAD * (274.1928 - 553068.6797 * t - 54.513 * t2e4
  435. - 10.116 * t3e6 + 4.797 * t4e8))
  436. + 0.0000127 * Math.cos(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  437. - 25.031 * t3e6 + 11.826 * t4e8))
  438. + 0.0000117 * Math.cos(DEG_TO_RAD * (184.1196 + 401329.0556 * t + 125.428 * t2e4
  439. + 18.579 * t3e6 - 8.798 * t4e8))
  440. - 0.0000078 * Math.cos(DEG_TO_RAD * (98.3124 - 151739.6240 * t + 70.916 * t2e4
  441. + 8.462 * t3e6 - 4.001 * t4e8))
  442. - 0.0000063 * Math.cos(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  443. + 3.623 * t3e6 - 1.769 * t4e8))
  444. + 0.0000063 * Math.cos(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  445. + 14.348 * t3e6 - 6.797 * t4e8))
  446. + 0.0000036 * Math.cos(DEG_TO_RAD * (321.5076 + 1443602.9027 * t + 21.912 * t2e4
  447. + 13.780 * t3e6 - 6.566 * t4e8))
  448. - 0.0000035 * Math.cos(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  449. + 18.011 * t3e6 - 8.566 * t4e8))
  450. + 0.0000024 * Math.cos(DEG_TO_RAD * (149.8932 + 337465.5434 * t - 87.113 * t2e4
  451. - 6.453 * t3e6 + 3.028 * t4e8))
  452. + 0.0000024 * Math.cos(DEG_TO_RAD * (170.9849 - 930404.9848 * t + 66.523 * t2e4
  453. + 0.608 * t3e6 - 0.232 * t4e8));
  454. var sgp = - 0.0203 * Math.cos(DEG_TO_RAD * (125.0 - 1934.1 * t))
  455. + 0.0034 * Math.cos(DEG_TO_RAD * (220.2 - 1935.5 * t));
  456. var gamma = 0.0449858 + sg + 1e-3 * sgp;
  457. //% longitude of perigee
  458. var sp = - 15.448 * Math.sin(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  459. - 10.684 * t3e6 + 5.028 * t4e8))
  460. - 9.642 * Math.sin(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  461. - 25.031 * t3e6 + 11.826 * t4e8))
  462. - 2.721 * Math.sin(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  463. + 14.348 * t3e6 - 6.797 * t4e8))
  464. + 2.607 * Math.sin(DEG_TO_RAD * (66.5106 + 349471.8432 * t - 335.112 * t2e4
  465. - 35.715 * t3e6 + 16.854 * t4e8))
  466. + 2.085 * Math.sin(DEG_TO_RAD * (201.4740 + 826670.7108 * t - 245.142 * t2e4
  467. - 21.367 * t3e6 + 10.057 * t4e8))
  468. + 1.477 * Math.sin(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  469. + 18.011 * t3e6 - 8.566 * t4e8))
  470. + 0.968 * Math.sin(DEG_TO_RAD * (291.5472 - 127727.0245 * t - 425.082 * t2e4
  471. - 50.062 * t3e6 + 23.651 * t4e8))
  472. - 0.949 * Math.sin(DEG_TO_RAD * (103.2079 + 377336.3051 * t - 121.035 * t2e4
  473. - 10.724 * t3e6 + 5.028 * t4e8))
  474. - 0.703 * Math.sin(DEG_TO_RAD * (167.2476 + 762807.1986 * t - 457.683 * t2e4
  475. - 46.398 * t3e6 + 21.882 * t4e8))
  476. - 0.660 * Math.sin(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  477. + 3.664 * t3e6 - 1.769 * t4e8))
  478. - 0.577 * Math.sin(DEG_TO_RAD * (190.8102 - 541062.3799 * t - 302.511 * t2e4
  479. - 39.379 * t3e6 + 18.623 * t4e8))
  480. - 0.524 * Math.sin(DEG_TO_RAD * (269.9268 + 954397.7353 * t + 179.941 * t2e4
  481. + 28.695 * t3e6 - 13.594 * t4e8))
  482. - 0.482 * Math.sin(DEG_TO_RAD * (32.2842 + 285608.3309 * t - 547.653 * t2e4
  483. - 60.746 * t3e6 + 28.679 * t4e8))
  484. + 0.452 * Math.sin(DEG_TO_RAD * (357.5291 + 35999.0503 * t - 1.536 * t2e4
  485. + 0.041 * t3e6 + 0.000 * t4e8))
  486. - 0.381 * Math.sin(DEG_TO_RAD * (302.2110 + 1240006.0662 * t - 367.713 * t2e4
  487. - 32.051 * t3e6 + 15.085 * t4e8))
  488. - 0.342 * Math.sin(DEG_TO_RAD * (328.2445 - 99862.5625 * t - 211.005 * t2e4
  489. - 25.072 * t3e6 + 11.826 * t4e8))
  490. - 0.312 * Math.sin(DEG_TO_RAD * (44.8902 + 1431596.6029 * t + 269.911 * t2e4
  491. + 43.043 * t3e6 - 20.392 * t4e8))
  492. + 0.282 * Math.sin(DEG_TO_RAD * (162.8868 - 31931.7561 * t - 106.271 * t2e4
  493. - 12.516 * t3e6 + 5.913 * t4e8))
  494. + 0.255 * Math.sin(DEG_TO_RAD * (203.9449 + 790671.6605 * t - 243.606 * t2e4
  495. - 21.408 * t3e6 + 10.057 * t4e8))
  496. + 0.252 * Math.sin(DEG_TO_RAD * (68.9815 + 313472.7929 * t - 333.576 * t2e4
  497. - 35.756 * t3e6 + 16.854 * t4e8))
  498. - 0.211 * Math.sin(DEG_TO_RAD * (83.3826 - 12006.2998 * t + 247.999 * t2e4
  499. + 29.262 * t3e6 - 13.826 * t4e8))
  500. + 0.193 * Math.sin(DEG_TO_RAD * (267.9846 + 1176142.5540 * t - 580.254 * t2e4
  501. - 57.082 * t3e6 + 26.911 * t4e8))
  502. + 0.191 * Math.sin(DEG_TO_RAD * (133.0212 + 698943.6863 * t - 670.224 * t2e4
  503. - 71.429 * t3e6 + 33.708 * t4e8))
  504. - 0.184 * Math.sin(DEG_TO_RAD * (55.8468 - 1018261.2475 * t - 392.482 * t2e4
  505. - 53.726 * t3e6 + 25.420 * t4e8))
  506. + 0.182 * Math.sin(DEG_TO_RAD * (145.6272 + 1844931.9583 * t + 147.340 * t2e4
  507. + 32.359 * t3e6 - 15.363 * t4e8))
  508. - 0.158 * Math.sin(DEG_TO_RAD * (257.3208 - 191590.5367 * t - 637.623 * t2e4
  509. - 75.093 * t3e6 + 35.477 * t4e8))
  510. + 0.148 * Math.sin(DEG_TO_RAD * (156.5838 - 604925.8921 * t - 515.053 * t2e4
  511. - 64.410 * t3e6 + 30.448 * t4e8))
  512. - 0.111 * Math.sin(DEG_TO_RAD * (169.7185 + 726808.1483 * t - 456.147 * t2e4
  513. - 46.439 * t3e6 + 21.882 * t4e8))
  514. + 0.101 * Math.sin(DEG_TO_RAD * (13.1347 + 1331734.0404 * t + 58.906 * t2e4
  515. + 17.971 * t3e6 - 8.566 * t4e8))
  516. + 0.100 * Math.sin(DEG_TO_RAD * (358.0578 + 221744.8187 * t - 760.194 * t2e4
  517. - 85.777 * t3e6 + 40.505 * t4e8))
  518. + 0.087 * Math.sin(DEG_TO_RAD * (98.2661 + 449334.4057 * t - 124.107 * t2e4
  519. - 10.643 * t3e6 + 5.028 * t4e8))
  520. + 0.080 * Math.sin(DEG_TO_RAD * (42.9480 + 1653341.4216 * t - 490.283 * t2e4
  521. - 42.734 * t3e6 + 20.113 * t4e8))
  522. + 0.080 * Math.sin(DEG_TO_RAD * (222.5657 - 441199.8173 * t - 91.506 * t2e4
  523. - 14.307 * t3e6 + 6.797 * t4e8))
  524. + 0.077 * Math.sin(DEG_TO_RAD * (294.0181 - 163726.0747 * t - 423.546 * t2e4
  525. - 50.103 * t3e6 + 23.651 * t4e8))
  526. - 0.073 * Math.sin(DEG_TO_RAD * (280.8834 - 1495460.1151 * t - 482.452 * t2e4
  527. - 68.074 * t3e6 + 32.217 * t4e8))
  528. - 0.071 * Math.sin(DEG_TO_RAD * (304.6819 + 1204007.0159 * t - 366.177 * t2e4
  529. - 32.092 * t3e6 + 15.085 * t4e8))
  530. - 0.069 * Math.sin(DEG_TO_RAD * (233.7582 + 1112279.0417 * t - 792.795 * t2e4
  531. - 82.113 * t3e6 + 38.736 * t4e8))
  532. - 0.067 * Math.sin(DEG_TO_RAD * (34.7551 + 249609.2807 * t - 546.117 * t2e4
  533. - 60.787 * t3e6 + 28.679 * t4e8))
  534. - 0.067 * Math.sin(DEG_TO_RAD * (263.6238 + 381403.5993 * t - 228.841 * t2e4
  535. - 23.199 * t3e6 + 10.941 * t4e8))
  536. + 0.055 * Math.sin(DEG_TO_RAD * (21.6203 - 1082124.7597 * t - 605.023 * t2e4
  537. - 78.757 * t3e6 + 37.246 * t4e8))
  538. + 0.055 * Math.sin(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  539. + 14.915 * t3e6 -7.029 * t4e8))
  540. - 0.054 * Math.sin(DEG_TO_RAD * (8.7216 + 1589477.9094 * t - 702.824 * t2e4
  541. - 67.766 * t3e6 + 31.939 * t4e8))
  542. - 0.052 * Math.sin(DEG_TO_RAD * (179.8536 + 1908795.4705 * t + 359.881 * t2e4
  543. + 57.390 * t3e6 - 27.189 * t4e8))
  544. - 0.050 * Math.sin(DEG_TO_RAD * (98.7948 + 635080.1741 * t - 882.765 * t2e4
  545. - 96.461 * t3e6 + 45.533 * t4e8))
  546. - 0.049 * Math.sin(DEG_TO_RAD * (128.6604 - 95795.2683 * t - 318.812 * t2e4
  547. - 37.547 * t3e6 + 17.738 * t4e8))
  548. - 0.047 * Math.sin(DEG_TO_RAD * (17.3544 + 425341.6552 * t - 370.570 * t2e4
  549. - 39.946 * t3e6 + 18.854 * t4e8))
  550. - 0.044 * Math.sin(DEG_TO_RAD * (160.4159 + 4067.2942 * t - 107.806 * t2e4
  551. - 12.475 * t3e6 + 5.913 * t4e8))
  552. - 0.043 * Math.sin(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  553. + 3.623 * t3e6 - 1.769 * t4e8))
  554. + 0.042 * Math.sin(DEG_TO_RAD * (270.4555 + 1140143.5037 * t - 578.718 * t2e4
  555. - 57.123 * t3e6 + 26.911 * t4e8))
  556. - 0.042 * Math.sin(DEG_TO_RAD * (132.4925 + 513197.9179 * t + 88.434 * t2e4
  557. + 14.388 * t3e6 - 6.797 * t4e8))
  558. - 0.041 * Math.sin(DEG_TO_RAD * (122.3573 - 668789.4043 * t - 727.594 * t2e4
  559. - 89.441 * t3e6 + 42.274 * t4e8))
  560. - 0.040 * Math.sin(DEG_TO_RAD * (105.6788 + 341337.2548 * t - 119.499 * t2e4
  561. - 10.765 * t3e6 + 5.028 * t4e8))
  562. + 0.038 * Math.sin(DEG_TO_RAD * (135.4921 + 662944.6361 * t - 668.688 * t2e4
  563. - 71.470 * t3e6 + 33.708 * t4e8))
  564. - 0.037 * Math.sin(DEG_TO_RAD * (242.3910 - 51857.2124 * t - 460.540 * t2e4
  565. - 54.293 * t3e6 + 25.652 * t4e8))
  566. + 0.036 * Math.sin(DEG_TO_RAD * (336.4374 + 1303869.5784 * t - 155.171 * t2e4
  567. - 7.020 * t3e6 + 3.259 * t4e8))
  568. + 0.035 * Math.sin(DEG_TO_RAD * (223.0943 - 255454.0489 * t - 850.164 * t2e4
  569. - 100.124 * t3e6 + 47.302 * t4e8))
  570. - 0.034 * Math.sin(DEG_TO_RAD * (193.2811 - 577061.4302 * t - 300.976 * t2e4
  571. - 39.419 * t3e6 + 18.623 * t4e8))
  572. + 0.031 * Math.sin(DEG_TO_RAD * (87.6023 - 918398.6850 * t - 181.476 * t2e4
  573. - 28.654 * t3e6 + 13.594 * t4e8));
  574. var spp = 2.4 * Math.sin(DEG_TO_RAD * (103.2 + 377336.3 * t));
  575. var lp = 83.353 + 4069.0137 * t - 103.238 * t2e4
  576. - 12.492 * t3e6 + 5.263 * t4e8 + sp + 1e-3 * t * spp;
  577. //% longitude of the ascending node
  578. var sr = - 1.4979 * Math.sin(DEG_TO_RAD * (49.1562 - 75869.8120 * t + 35.458 * t2e4
  579. + 4.231 * t3e6 - 2.001 * t4e8))
  580. - 0.1500 * Math.sin(DEG_TO_RAD * (357.5291 + 35999.0503 * t - 1.536 * t2e4
  581. + 0.041 * t3e6 + 0.000 * t4e8))
  582. - 0.1226 * Math.sin(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  583. + 3.664 * t3e6 - 1.769 * t4e8))
  584. + 0.1176 * Math.sin(DEG_TO_RAD * (186.5442 + 966404.0351 * t - 68.058 * t2e4
  585. - 0.567 * t3e6 + 0.232 * t4e8))
  586. - 0.0801 * Math.sin(DEG_TO_RAD * (83.3826 - 12006.2998 * t + 247.999 * t2e4
  587. + 29.262 * t3e6 - 13.826 * t4e8))
  588. - 0.0616 * Math.sin(DEG_TO_RAD * (51.6271 - 111868.8623 * t + 36.994 * t2e4
  589. + 4.190 * t3e6 - 2.001 * t4e8))
  590. + 0.0490 * Math.sin(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  591. - 10.684 * t3e6 + 5.028 * t4e8))
  592. + 0.0409 * Math.sin(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  593. + 14.915 * t3e6 - 7.029 * t4e8))
  594. + 0.0327 * Math.sin(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  595. + 14.348 * t3e6 - 6.797 * t4e8))
  596. + 0.0324 * Math.sin(DEG_TO_RAD * (46.6853 - 39870.7617 * t + 33.922 * t2e4
  597. + 4.272 * t3e6 - 2.001 * t4e8))
  598. + 0.0196 * Math.sin(DEG_TO_RAD * (98.3124 - 151739.6240 * t + 70.916 * t2e4
  599. + 8.462 * t3e6 - 4.001 * t4e8))
  600. + 0.0180 * Math.sin(DEG_TO_RAD * (274.1928 - 553068.6797 * t - 54.513 * t2e4
  601. - 10.116 * t3e6 + 4.797 * t4e8))
  602. + 0.0150 * Math.sin(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  603. - 25.031 * t3e6 + 11.826 * t4e8))
  604. - 0.0150 * Math.sin(DEG_TO_RAD * (184.1196 + 401329.0556 * t + 125.428 * t2e4
  605. + 18.579 * t3e6 - 8.798 * t4e8))
  606. - 0.0078 * Math.sin(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  607. + 3.623 * t3e6 - 1.769 * t4e8))
  608. - 0.0045 * Math.sin(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  609. + 18.011 * t3e6 - 8.566 * t4e8))
  610. + 0.0044 * Math.sin(DEG_TO_RAD * (321.5076 + 1443602.9027 * t + 21.912 * t2e4
  611. + 13.780 * t3e6 - 6.566 * t4e8))
  612. - 0.0042 * Math.sin(DEG_TO_RAD * (162.8868 - 31931.7561 * t - 106.271 * t2e4
  613. - 12.516 * t3e6 + 5.913 * t4e8))
  614. - 0.0031 * Math.sin(DEG_TO_RAD * (170.9849 - 930404.9848 * t + 66.523 * t2e4
  615. + 0.608 * t3e6 - 0.232 * t4e8))
  616. + 0.0031 * Math.sin(DEG_TO_RAD * (103.2079 + 377336.3051 * t - 121.035 * t2e4
  617. - 10.724 * t3e6 + 5.028 * t4e8))
  618. + 0.0029 * Math.sin(DEG_TO_RAD * (222.6120 - 1042273.8471 * t + 103.516 * t2e4
  619. + 4.798 * t3e6 - 2.232 * t4e8))
  620. + 0.0028 * Math.sin(DEG_TO_RAD * (184.0733 + 1002403.0853 * t - 69.594 * t2e4
  621. - 0.526 * t3e6 + 0.232 * t4e8));
  622. var srp = 25.9 * Math.sin(DEG_TO_RAD * (125.0 - 1934.1 * t))
  623. - 4.3 * Math.sin(DEG_TO_RAD * (220.2 - 1935.5 * t));
  624. var srpp = 0.38 * Math.sin(DEG_TO_RAD * (357.5 + 35999.1 * t));
  625. var raan = 125.0446 - 1934.13618 * t + 20.762 * t2e4
  626. + 2.139 * t3e6 - 1.650 * t4e8 + sr
  627. + 1e-3 * (srp + srpp * t);
  628. //% mean longitude
  629. var sl = - 0.92581 * Math.sin(DEG_TO_RAD * (235.7004 + 890534.2230 * t - 32.601 * t2e4
  630. + 3.664 * t3e6 - 1.769 * t4e8))
  631. + 0.33262 * Math.sin(DEG_TO_RAD * (100.7370 + 413335.3554 * t - 122.571 * t2e4
  632. - 10.684 * t3e6 + 5.028 * t4e8))
  633. - 0.18402 * Math.sin(DEG_TO_RAD * (357.5291 + 35999.0503 * t - 1.536 * t2e4
  634. + 0.041 * t3e6 + 0.000 * t4e8))
  635. + 0.11007 * Math.sin(DEG_TO_RAD * (134.9634 + 477198.8676 * t + 89.970 * t2e4
  636. + 14.348 * t3e6 - 6.797 * t4e8))
  637. - 0.06055 * Math.sin(DEG_TO_RAD * (238.1713 + 854535.1727 * t - 31.065 * t2e4
  638. + 3.623 * t3e6 - 1.769 * t4e8))
  639. + 0.04741 * Math.sin(DEG_TO_RAD * (325.7736 - 63863.5122 * t - 212.541 * t2e4
  640. - 25.031 * t3e6 + 11.826 * t4e8))
  641. - 0.03086 * Math.sin(DEG_TO_RAD * (10.6638 + 1367733.0907 * t + 57.370 * t2e4
  642. + 18.011 * t3e6 - 8.566 * t4e8))
  643. + 0.02184 * Math.sin(DEG_TO_RAD * (103.2079 + 377336.3051 * t - 121.035 * t2e4
  644. - 10.724 * t3e6 + 5.028 * t4e8))
  645. + 0.01645 * Math.sin(DEG_TO_RAD * (49.1562 - 75869.8120 * t + 35.458 * t2e4
  646. + 4.231 * t3e6 - 2.001 * t4e8))
  647. + 0.01022 * Math.sin(DEG_TO_RAD * (233.2295 + 926533.2733 * t - 34.136 * t2e4
  648. + 3.705 * t3e6 - 1.769 * t4e8))
  649. - 0.00756 * Math.sin(DEG_TO_RAD * (336.4374 + 1303869.5784 * t - 155.171 * t2e4
  650. - 7.020 * t3e6 + 3.259 * t4e8))
  651. - 0.00530 * Math.sin(DEG_TO_RAD * (222.5657 - 441199.8173 * t - 91.506 * t2e4
  652. - 14.307 * t3e6 + 6.797 * t4e8))
  653. - 0.00496 * Math.sin(DEG_TO_RAD * (162.8868 - 31931.7561 * t - 106.271 * t2e4
  654. - 12.516 * t3e6 + 5.913 * t4e8))
  655. - 0.00472 * Math.sin(DEG_TO_RAD * (297.8502 + 445267.1115 * t - 16.300 * t2e4
  656. + 1.832 * t3e6 - 0.884 * t4e8))
  657. - 0.00271 * Math.sin(DEG_TO_RAD * (240.6422 + 818536.1225 * t - 29.529 * t2e4
  658. + 3.582 * t3e6 - 1.769 * t4e8))
  659. + 0.00264 * Math.sin(DEG_TO_RAD * (132.4925 + 513197.9179 * t + 88.434 * t2e4
  660. + 14.388 * t3e6 - 6.797 * t4e8))
  661. - 0.00254 * Math.sin(DEG_TO_RAD * (186.5442 + 966404.0351 * t - 68.058 * t2e4
  662. - 0.567 * t3e6 + 0.232 * t4e8))
  663. + 0.00234 * Math.sin(DEG_TO_RAD * (269.9268 + 954397.7353 * t + 179.941 * t2e4
  664. + 28.695 * t3e6 - 13.594 * t4e8))
  665. - 0.00220 * Math.sin(DEG_TO_RAD * (13.1347 + 1331734.0404 * t + 58.906 * t2e4
  666. + 17.971 * t3e6 - 8.566 * t4e8))
  667. - 0.00202 * Math.sin(DEG_TO_RAD * (355.0582 + 71998.1006 * t - 3.072 * t2e4
  668. + 0.082 * t3e6 + 0.000 * t4e8))
  669. + 0.00167 * Math.sin(DEG_TO_RAD * (328.2445 - 99862.5625 * t - 211.005 * t2e4
  670. - 25.072 * t3e6 + 11.826 * t4e8))
  671. - 0.00143 * Math.sin(DEG_TO_RAD * (173.5506 + 1335801.3346 * t - 48.901 * t2e4
  672. + 5.496 * t3e6 - 2.653 * t4e8))
  673. - 0.00121 * Math.sin(DEG_TO_RAD * (98.2661 + 449334.4057 * t - 124.107 * t2e4
  674. - 10.643 * t3e6 + 5.028 * t4e8))
  675. - 0.00116 * Math.sin(DEG_TO_RAD * (145.6272 + 1844931.9583 * t + 147.340 * t2e4
  676. + 32.359 * t3e6 - 15.363 * t4e8))
  677. + 0.00102 * Math.sin(DEG_TO_RAD * (105.6788 + 341337.2548 * t - 119.499 * t2e4
  678. - 10.765 * t3e6 + 5.028 * t4e8))
  679. - 0.00090 * Math.sin(DEG_TO_RAD * (184.1196 + 401329.0556 * t + 125.428 * t2e4
  680. + 18.579 * t3e6 - 8.798 * t4e8))
  681. - 0.00086 * Math.sin(DEG_TO_RAD * (338.9083 + 1267870.5281 * t - 153.636 * t2e4
  682. - 7.061 * t3e6 + 3.259 * t4e8))
  683. - 0.00078 * Math.sin(DEG_TO_RAD * (111.4008 + 1781068.4461 * t - 65.201 * t2e4
  684. + 7.328 * t3e6 - 3.538 * t4e8))
  685. + 0.00069 * Math.sin(DEG_TO_RAD * (323.3027 - 27864.4619 * t - 214.077 * t2e4
  686. - 24.990 * t3e6 + 11.826 * t4e8))
  687. + 0.00066 * Math.sin(DEG_TO_RAD * (51.6271 - 111868.8623 * t + 36.994 * t2e4
  688. + 4.190 * t3e6 - 2.001 * t4e8))
  689. + 0.00065 * Math.sin(DEG_TO_RAD * (38.5872 + 858602.4669 * t - 138.871 * t2e4
  690. - 8.852 * t3e6 + 4.144 * t4e8))
  691. - 0.00060 * Math.sin(DEG_TO_RAD * (83.3826 - 12006.2998 * t + 247.999 * t2e4
  692. + 29.262 * t3e6 - 13.826 * t4e8))
  693. + 0.00054 * Math.sin(DEG_TO_RAD * (201.4740 + 826670.7108 * t - 245.142 * t2e4
  694. - 21.367 * t3e6 + 10.057 * t4e8))
  695. - 0.00052 * Math.sin(DEG_TO_RAD * (308.4192 - 489205.1674 * t + 158.029 * t2e4
  696. + 14.915 * t3e6 - 7.029 * t4e8))
  697. + 0.00048 * Math.sin(DEG_TO_RAD * (8.1929 + 1403732.1410 * t + 55.834 * t2e4
  698. + 18.052 * t3e6 - 8.566 * t4e8))
  699. - 0.00041 * Math.sin(DEG_TO_RAD * (46.6853 - 39870.7617 * t + 33.922 * t2e4
  700. + 4.272 * t3e6 - 2.001 * t4e8))
  701. - 0.00033 * Math.sin(DEG_TO_RAD * (274.1928 - 553068.6797 * t - 54.513 * t2e4
  702. - 10.116 * t3e6 + 4.797 * t4e8))
  703. + 0.00030 * Math.sin(DEG_TO_RAD * (160.4159 + 4067.2942 * t - 107.806 * t2e4
  704. - 12.475 * t3e6 + 5.913 * t4e8));
  705. var slp = 3.96 * Math.sin(DEG_TO_RAD * (119.7 + 131.8 * t))
  706. + 1.96 * Math.sin(DEG_TO_RAD * (125.0 - 1934.1 * t));
  707. var slpp = 0.463 * Math.sin(DEG_TO_RAD * (357.5 + 35999.1 * t))
  708. + 0.152 * Math.sin(DEG_TO_RAD * (238.2 + 854535.2 * t))
  709. - 0.071 * Math.sin(DEG_TO_RAD * (27.8 + 131.8 * t))
  710. - 0.055 * Math.sin(DEG_TO_RAD * (103.2 + 377336.3 * t))
  711. - 0.026 * Math.sin(DEG_TO_RAD * (233.2 + 926533.3 * t));
  712. var slppp = 14 * Math.sin(DEG_TO_RAD * (357.5 + 35999.1 * t))
  713. + 5 * Math.sin(DEG_TO_RAD * (238.2 + 854535.2 * t));
  714. var lambda = 218.31665 + 481267.88134 * t - 13.268 * t2e4
  715. + 1.856 * t3e6 - 1.534 * t4e8 + sl
  716. + 1e-3 * (slp + slpp * t + slppp * t2e4);
  717. var computed = {
  718. a : sma * 1000,
  719. e : ecc,
  720. i : 2.0 * Math.asin(gamma) * RAD_TO_DEG,
  721. w : ( (lp - raan)) % 360,
  722. o : ( raan) % 360,
  723. M : ( (lambda - lp)) % 360
  724. };
  725. return computed;
  726. };
  727. },{"ns":6}],6:[function(require,module,exports){
  728. /*
  729. Global vars
  730. */
  731. 'use strict';
  732. module.exports = {
  733. //gravitational constant to measure the force with masses in kg and radii in meters N(m/kg)^2
  734. G : 6.6742e-11,
  735. //astronomical unit in km
  736. AU : 149597870,
  737. CIRCLE : 2 * Math.PI,
  738. KM : 1000,
  739. DEG_TO_RAD : Math.PI/180,
  740. RAD_TO_DEG : 180/Math.PI,
  741. NM_TO_KM : 1.852,
  742. LB_TO_KG : 0.453592,
  743. LBF_TO_NEWTON : 4.44822162,
  744. FT_TO_M : 0.3048,
  745. //duration in seconds
  746. DAY : 60 * 60 * 24,
  747. //duration in days
  748. YEAR : 365.25,
  749. //duration in days
  750. CENTURY : 100 * 365.25,
  751. SIDERAL_DAY : 3600 * 23.9344696,
  752. J2000 : new Date('2000-01-01T12:00:00-00:00'),
  753. getEpochTime : function(userDate) {
  754. userDate = userDate || new Date();
  755. return ((userDate - this.J2000) / 1000) ;
  756. }
  757. };
  758. },{}],7:[function(require,module,exports){
  759. 'use strict';
  760. var ns = require('ns');
  761. var Utils = require('./Utils');
  762. var THREE = require('./Three.shim');
  763. var CMath = require('./Math');
  764. var maxIterationsForEccentricAnomaly = 10;
  765. var maxDE = 1e-15;
  766. var solveEccentricAnomaly = function(f, x0, maxIter) {
  767. var x = 0;
  768. var x2 = x0;
  769. for (var i = 0; i < maxIter; i++) {
  770. x = x2;
  771. x2 = f(x);
  772. }
  773. return x2;
  774. }
  775. var solveKepler = function(e, M) {
  776. return function(x) {
  777. return x + (M + e * Math.sin(x) - x) / (1 - e * Math.cos(x));
  778. };
  779. };
  780. var solveKeplerLaguerreConway = function(e, M) {
  781. return function(x) {
  782. var s = e * Math.sin(x);
  783. var c = e * Math.cos(x);
  784. var f = x - s - M;
  785. var f1 = 1 - c;
  786. var f2 = s;
  787. x += -5 * f / (f1 + CMath.sign(f1) * Math.sqrt(Math.abs(16 * f1 * f1 - 20 * f * f2)));
  788. return x;
  789. };
  790. };
  791. var solveKeplerLaguerreConwayHyp = function(e, M) {
  792. return function(x) {
  793. var s = e * CMath.sinh(x);
  794. var c = e * CMath.cosh(x);
  795. var f = x - s - M;
  796. var f1 = c - 1;
  797. var f2 = s;
  798. x += -5 * f / (f1 + CMath.sign(f1) * Math.sqrt(Math.abs(16 * f1 * f1 - 20 * f * f2)));
  799. return x;
  800. };
  801. };
  802. module.exports = {
  803. setDefaultOrbit : function(orbitalElements, calculator) {
  804. this.orbitalElements = orbitalElements;
  805. if(orbitalElements && orbitalElements.epoch) {
  806. this.epochCorrection = ns.getEpochTime(orbitalElements.epoch);
  807. }
  808. this.calculator = calculator;
  809. },
  810. setName : function(name){
  811. this.name = name;
  812. },
  813. calculateVelocity : function(timeEpoch, relativeTo, isFromDelta) {
  814. if(!this.orbitalElements) return new THREE.Vector3(0,0,0);
  815. var eclipticVelocity;
  816. if ( isFromDelta ) {
  817. var pos1 = this.calculatePosition(timeEpoch);
  818. var pos2 = this.calculatePosition(timeEpoch + 60);
  819. eclipticVelocity = pos2.sub(pos1).multiplyScalar(1/60);
  820. } else {
  821. //vis viva to calculate speed (not velocity, i.e not a vector)
  822. var el = this.calculateElements(timeEpoch);
  823. var speed = Math.sqrt(ns.G * require('./SolarSystem').getBody(relativeTo).mass * ((2 / (el.r)) - (1 / (el.a))));
  824. //now calculate velocity orientation, that is, a vector tangent to the orbital ellipse
  825. var k = el.r / el.a;
  826. var o = ((2 - (2 * el.e * el.e)) / (k * (2-k)))-1;
  827. //floating point imprecision
  828. o = o > 1 ? 1 : o;
  829. var alpha = Math.PI - Math.acos(o);
  830. alpha = el.v < 0 ? (2 * Math.PI) - alpha : alpha;
  831. var velocityAngle = el.v + (alpha / 2);
  832. //velocity vector in the plane of the orbit
  833. var orbitalVelocity = new THREE.Vector3(Math.cos(velocityAngle), Math.sin(velocityAngle)).setLength(speed);
  834. var velocityEls = Utils.extend({}, el, {pos:orbitalVelocity, v:null, r:null});
  835. eclipticVelocity = this.getPositionFromElements(velocityEls);
  836. }
  837. //var diff = eclipticVelocityFromDelta.sub(eclipticVelocity);console.log(diff.length());
  838. return eclipticVelocity;
  839. },
  840. calculatePosition : function(timeEpoch) {
  841. if(!this.orbitalElements) return new THREE.Vector3(0,0,0);
  842. var computed = this.calculateElements(timeEpoch);
  843. var pos = this.getPositionFromElements(computed);
  844. return pos;
  845. },
  846. solveEccentricAnomaly : function(e, M){
  847. if (e == 0.0) {
  848. return M;
  849. } else if (e < 0.9) {
  850. var sol = solveEccentricAnomaly(solveKepler(e, M), M, 6);
  851. return sol;
  852. } else if (e < 1.0) {
  853. var E = M + 0.85 * e * ((Math.sin(M) >= 0.0) ? 1 : -1);
  854. var sol = solveEccentricAnomaly(solveKeplerLaguerreConway(e, M), E, 8);
  855. return sol;
  856. } else if (e == 1.0) {
  857. return M;
  858. } else {
  859. var E = Math.log(2 * M / e + 1.85);
  860. var sol = solveEccentricAnomaly(solveKeplerLaguerreConwayHyp(e, M), E, 30);
  861. return sol;
  862. }
  863. },
  864. calculateElements : function(timeEpoch, forcedOrbitalElements) {
  865. if(!forcedOrbitalElements && !this.orbitalElements) return null;
  866. var orbitalElements = forcedOrbitalElements || this.orbitalElements;
  867. /*
  868. Epoch : J2000
  869. a Semi-major axis
  870. e Eccentricity
  871. i Inclination
  872. o Longitude of Ascending Node (Ω)
  873. w Argument of periapsis (ω)
  874. E Eccentric Anomaly
  875. T Time at perihelion
  876. M Mean anomaly
  877. l Mean Longitude
  878. lp longitude of periapsis
  879. r distance du centre
  880. v true anomaly
  881. P Sidereal period (mean value)
  882. Pw Argument of periapsis precession period (mean value)
  883. Pn Longitude of the ascending node precession period (mean value)
  884. */
  885. if (this.epochCorrection) {
  886. timeEpoch -= this.epochCorrection;
  887. }
  888. var tDays = timeEpoch / ns.DAY;
  889. var T = tDays / ns.CENTURY ;
  890. //console.log(T);
  891. var computed = {
  892. t : timeEpoch
  893. };
  894. if(this.calculator && !forcedOrbitalElements) {
  895. var realorbit = this.calculator(T);
  896. Utils.extend(computed, realorbit);
  897. } else {
  898. if (orbitalElements.base) {
  899. var variation;
  900. for(var el in orbitalElements.base) {
  901. //cy : variation by century.
  902. //day : variation by day.
  903. variation = orbitalElements.cy ? orbitalElements.cy[el] : (orbitalElements.day[el] * ns.CENTURY);
  904. variation = variation || 0;
  905. computed[el] = orbitalElements.base[el] + (variation * T);
  906. }
  907. } else {
  908. computed = Utils.extend({}, orbitalElements);
  909. }
  910. if (undefined === computed.w) {
  911. computed.w = computed.lp - computed.o;
  912. }
  913. if (undefined === computed.M) {
  914. computed.M = computed.l - computed.lp;
  915. }
  916. computed.a = computed.a * ns.KM;//was in km, set it in m
  917. }
  918. computed.i = ns.DEG_TO_RAD * computed.i;
  919. computed.o = ns.DEG_TO_RAD * computed.o;
  920. computed.w = ns.DEG_TO_RAD * computed.w;
  921. computed.M = ns.DEG_TO_RAD * computed.M;
  922. computed.E = this.solveEccentricAnomaly(computed.e, computed.M);
  923. computed.E = computed.E % ns.CIRCLE;
  924. computed.i = computed.i % ns.CIRCLE;
  925. computed.o = computed.o % ns.CIRCLE;
  926. computed.w = computed.w % ns.CIRCLE;
  927. computed.M = computed.M % ns.CIRCLE;
  928. //in the plane of the orbit
  929. computed.pos = new THREE.Vector3(computed.a * (Math.cos(computed.E) - computed.e), computed.a * (Math.sqrt(1 - (computed.e*computed.e))) * Math.sin(computed.E));
  930. computed.r = computed.pos.length();
  931. computed.v = Math.atan2(computed.pos.y, computed.pos.x);
  932. if(orbitalElements.relativeTo) {
  933. var relativeTo = require('./SolarSystem').getBody(orbitalElements.relativeTo);
  934. if(relativeTo.tilt) {
  935. computed.tilt = -relativeTo.tilt * ns.DEG_TO_RAD;
  936. }
  937. };
  938. return computed;
  939. },
  940. getPositionFromElements : function(computed) {
  941. if(!computed) return new THREE.Vector3(0,0,0);
  942. var a1 = new THREE.Euler(computed.tilt || 0, 0, computed.o, 'XYZ');
  943. var q1 = new THREE.Quaternion().setFromEuler(a1);
  944. var a2 = new THREE.Euler(computed.i, 0, computed.w, 'XYZ');
  945. var q2 = new THREE.Quaternion().setFromEuler(a2);
  946. var planeQuat = new THREE.Quaternion().multiplyQuaternions(q1, q2);
  947. computed.pos.applyQuaternion(planeQuat);
  948. return computed.pos;
  949. },
  950. calculatePeriod : function(elements, relativeTo) {
  951. var period;
  952. if(this.orbitalElements && this.orbitalElements.day && this.orbitalElements.day.M) {
  953. period = 360 / this.orbitalElements.day.M ;
  954. }else if(require('./SolarSystem').getBody(relativeTo) && require('./SolarSystem').getBody(relativeTo).k && elements) {
  955. period = 2 * Math.PI * Math.sqrt(Math.pow(elements.a/(ns.AU*1000), 3)) / require('./SolarSystem').getBody(relativeTo).k;
  956. }
  957. period *= ns.DAY;//in seconds
  958. return period;
  959. }
  960. };
  961. },{"./Math":4,"./SolarSystem":8,"./Three.shim":9,"./Utils":10,"ns":6}],8:[function(require,module,exports){
  962. 'use strict';
  963. var ns = require('ns');
  964. var Utils = require('./Utils');
  965. var definitions = require('./Definitions');
  966. var CelestialBody = require('./CelestialBody');
  967. var bodies = definitions.map(function(def){
  968. var body = Object.create(CelestialBody);
  969. Utils.extend(body, def);
  970. body.init();
  971. return body;
  972. });
  973. var names = bodies.reduce(function(carry, body){
  974. carry[body.name] = body;
  975. return carry;
  976. }, {});
  977. var central = bodies.reduce(function(carry, body){
  978. carry = carry && carry.mass > body.mass ? carry : body;
  979. return carry;
  980. }, null);
  981. console.log(bodies);
  982. module.exports = {
  983. getBody: function(name){
  984. return names[name] || central;
  985. },
  986. getPositions: function(userDate, calculateVelocity){
  987. var epochTime = ns.getEpochTime(userDate);
  988. return bodies.map(function(body){
  989. body.setPositionFromDate(epochTime, calculateVelocity);
  990. return {
  991. name: body.name,
  992. position: body.getPosition(),
  993. velocity: body.getVelocity()
  994. };
  995. });
  996. }
  997. };
  998. },{"./CelestialBody":2,"./Definitions":3,"./Utils":10,"ns":6}],9:[function(require,module,exports){
  999. (function (global){
  1000. 'use strict';
  1001. var THREE = global.THREE = {};
  1002. require('../vendor/three/math/Vector3');
  1003. require('../vendor/three/math/Quaternion');
  1004. require('../vendor/three/math/Euler');
  1005. module.exports = THREE;
  1006. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  1007. },{"../vendor/three/math/Euler":11,"../vendor/three/math/Quaternion":12,"../vendor/three/math/Vector3":13}],10:[function(require,module,exports){
  1008. /*
  1009. Global vars
  1010. */
  1011. 'use strict';
  1012. var extend = function(){
  1013. if(arguments.length === 1) return arguments[0];
  1014. var source = Array.prototype.splice.call(arguments, 1, 1)[0];
  1015. arguments[0] = Object.keys(source).reduce(function(carry, key){
  1016. carry[key] = source[key];
  1017. return carry;
  1018. }, arguments[0]);
  1019. return extend.apply(null, arguments);
  1020. };
  1021. module.exports = {
  1022. extend: extend
  1023. };
  1024. },{}],11:[function(require,module,exports){
  1025. /**
  1026. * @author mrdoob / http://mrdoob.com/
  1027. * @author WestLangley / http://github.com/WestLangley
  1028. * @author bhouston / http://exocortex.com
  1029. */
  1030. THREE.Euler = function ( x, y, z, order ) {
  1031. this._x = x || 0;
  1032. this._y = y || 0;
  1033. this._z = z || 0;
  1034. this._order = order || THREE.Euler.DefaultOrder;
  1035. };
  1036. THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
  1037. THREE.Euler.DefaultOrder = 'XYZ';
  1038. THREE.Euler.prototype = {
  1039. constructor: THREE.Euler,
  1040. _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder,
  1041. get x () {
  1042. return this._x;
  1043. },
  1044. set x ( value ) {
  1045. this._x = value;
  1046. this.onChangeCallback();
  1047. },
  1048. get y () {
  1049. return this._y;
  1050. },
  1051. set y ( value ) {
  1052. this._y = value;
  1053. this.onChangeCallback();
  1054. },
  1055. get z () {
  1056. return this._z;
  1057. },
  1058. set z ( value ) {
  1059. this._z = value;
  1060. this.onChangeCallback();
  1061. },
  1062. get order () {
  1063. return this._order;
  1064. },
  1065. set order ( value ) {
  1066. this._order = value;
  1067. this.onChangeCallback();
  1068. },
  1069. set: function ( x, y, z, order ) {
  1070. this._x = x;
  1071. this._y = y;
  1072. this._z = z;
  1073. this._order = order || this._order;
  1074. this.onChangeCallback();
  1075. return this;
  1076. },
  1077. copy: function ( euler ) {
  1078. this._x = euler._x;
  1079. this._y = euler._y;
  1080. this._z = euler._z;
  1081. this._order = euler._order;
  1082. this.onChangeCallback();
  1083. return this;
  1084. },
  1085. setFromRotationMatrix: function ( m, order, update ) {
  1086. var clamp = THREE.Math.clamp;
  1087. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  1088. var te = m.elements;
  1089. var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
  1090. var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
  1091. var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
  1092. order = order || this._order;
  1093. if ( order === 'XYZ' ) {
  1094. this._y = Math.asin( clamp( m13, - 1, 1 ) );
  1095. if ( Math.abs( m13 ) < 0.99999 ) {
  1096. this._x = Math.atan2( - m23, m33 );
  1097. this._z = Math.atan2( - m12, m11 );
  1098. } else {
  1099. this._x = Math.atan2( m32, m22 );
  1100. this._z = 0;
  1101. }
  1102. } else if ( order === 'YXZ' ) {
  1103. this._x = Math.asin( - clamp( m23, - 1, 1 ) );
  1104. if ( Math.abs( m23 ) < 0.99999 ) {
  1105. this._y = Math.atan2( m13, m33 );
  1106. this._z = Math.atan2( m21, m22 );
  1107. } else {
  1108. this._y = Math.atan2( - m31, m11 );
  1109. this._z = 0;
  1110. }
  1111. } else if ( order === 'ZXY' ) {
  1112. this._x = Math.asin( clamp( m32, - 1, 1 ) );
  1113. if ( Math.abs( m32 ) < 0.99999 ) {
  1114. this._y = Math.atan2( - m31, m33 );
  1115. this._z = Math.atan2( - m12, m22 );
  1116. } else {
  1117. this._y = 0;
  1118. this._z = Math.atan2( m21, m11 );
  1119. }
  1120. } else if ( order === 'ZYX' ) {
  1121. this._y = Math.asin( - clamp( m31, - 1, 1 ) );
  1122. if ( Math.abs( m31 ) < 0.99999 ) {
  1123. this._x = Math.atan2( m32, m33 );
  1124. this._z = Math.atan2( m21, m11 );
  1125. } else {
  1126. this._x = 0;
  1127. this._z = Math.atan2( - m12, m22 );
  1128. }
  1129. } else if ( order === 'YZX' ) {
  1130. this._z = Math.asin( clamp( m21, - 1, 1 ) );
  1131. if ( Math.abs( m21 ) < 0.99999 ) {
  1132. this._x = Math.atan2( - m23, m22 );
  1133. this._y = Math.atan2( - m31, m11 );
  1134. } else {
  1135. this._x = 0;
  1136. this._y = Math.atan2( m13, m33 );
  1137. }
  1138. } else if ( order === 'XZY' ) {
  1139. this._z = Math.asin( - clamp( m12, - 1, 1 ) );
  1140. if ( Math.abs( m12 ) < 0.99999 ) {
  1141. this._x = Math.atan2( m32, m22 );
  1142. this._y = Math.atan2( m13, m11 );
  1143. } else {
  1144. this._x = Math.atan2( - m23, m33 );
  1145. this._y = 0;
  1146. }
  1147. } else {
  1148. THREE.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order )
  1149. }
  1150. this._order = order;
  1151. if ( update !== false ) this.onChangeCallback();
  1152. return this;
  1153. },
  1154. setFromQuaternion: function () {
  1155. var matrix;
  1156. return function ( q, order, update ) {
  1157. if ( matrix === undefined ) matrix = new THREE.Matrix4();
  1158. matrix.makeRotationFromQuaternion( q );
  1159. this.setFromRotationMatrix( matrix, order, update );
  1160. return this;
  1161. };
  1162. }(),
  1163. setFromVector3: function ( v, order ) {
  1164. return this.set( v.x, v.y, v.z, order || this._order );
  1165. },
  1166. reorder: function () {
  1167. // WARNING: this discards revolution information -bhouston
  1168. var q = new THREE.Quaternion();
  1169. return function ( newOrder ) {
  1170. q.setFromEuler( this );
  1171. this.setFromQuaternion( q, newOrder );
  1172. };
  1173. }(),
  1174. equals: function ( euler ) {
  1175. return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
  1176. },
  1177. fromArray: function ( array ) {
  1178. this._x = array[ 0 ];
  1179. this._y = array[ 1 ];
  1180. this._z = array[ 2 ];
  1181. if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
  1182. this.onChangeCallback();
  1183. return this;
  1184. },
  1185. toArray: function ( array, offset ) {
  1186. if ( array === undefined ) array = [];
  1187. if ( offset === undefined ) offset = 0;
  1188. array[ offset ] = this._x;
  1189. array[ offset + 1 ] = this._y;
  1190. array[ offset + 2 ] = this._z;
  1191. array[ offset + 3 ] = this._order;
  1192. return array;
  1193. },
  1194. toVector3: function ( optionalResult ) {
  1195. if ( optionalResult ) {
  1196. return optionalResult.set( this._x, this._y, this._z );
  1197. } else {
  1198. return new THREE.Vector3( this._x, this._y, this._z );
  1199. }
  1200. },
  1201. onChange: function ( callback ) {
  1202. this.onChangeCallback = callback;
  1203. return this;
  1204. },
  1205. onChangeCallback: function () {},
  1206. clone: function () {
  1207. return new THREE.Euler( this._x, this._y, this._z, this._order );
  1208. }
  1209. };
  1210. },{}],12:[function(require,module,exports){
  1211. /**
  1212. * @author mikael emtinger / http://gomo.se/
  1213. * @author alteredq / http://alteredqualia.com/
  1214. * @author WestLangley / http://github.com/WestLangley
  1215. * @author bhouston / http://exocortex.com
  1216. */
  1217. THREE.Quaternion = function ( x, y, z, w ) {
  1218. this._x = x || 0;
  1219. this._y = y || 0;
  1220. this._z = z || 0;
  1221. this._w = ( w !== undefined ) ? w : 1;
  1222. };
  1223. THREE.Quaternion.prototype = {
  1224. constructor: THREE.Quaternion,
  1225. _x: 0,_y: 0, _z: 0, _w: 0,
  1226. get x () {
  1227. return this._x;
  1228. },
  1229. set x ( value ) {
  1230. this._x = value;
  1231. this.onChangeCallback();
  1232. },
  1233. get y () {
  1234. return this._y;
  1235. },
  1236. set y ( value ) {
  1237. this._y = value;
  1238. this.onChangeCallback();
  1239. },
  1240. get z () {
  1241. return this._z;
  1242. },
  1243. set z ( value ) {
  1244. this._z = value;
  1245. this.onChangeCallback();
  1246. },
  1247. get w () {
  1248. return this._w;
  1249. },
  1250. set w ( value ) {
  1251. this._w = value;
  1252. this.onChangeCallback();
  1253. },
  1254. set: function ( x, y, z, w ) {
  1255. this._x = x;
  1256. this._y = y;
  1257. this._z = z;
  1258. this._w = w;
  1259. this.onChangeCallback();
  1260. return this;
  1261. },
  1262. copy: function ( quaternion ) {
  1263. this._x = quaternion.x;
  1264. this._y = quaternion.y;
  1265. this._z = quaternion.z;
  1266. this._w = quaternion.w;
  1267. this.onChangeCallback();
  1268. return this;
  1269. },
  1270. setFromEuler: function ( euler, update ) {
  1271. if ( euler instanceof THREE.Euler === false ) {
  1272. throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
  1273. }
  1274. // http://www.mathworks.com/matlabcentral/fileexchange/
  1275. // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
  1276. // content/SpinCalc.m
  1277. var c1 = Math.cos( euler._x / 2 );
  1278. var c2 = Math.cos( euler._y / 2 );
  1279. var c3 = Math.cos( euler._z / 2 );
  1280. var s1 = Math.sin( euler._x / 2 );
  1281. var s2 = Math.sin( euler._y / 2 );
  1282. var s3 = Math.sin( euler._z / 2 );
  1283. if ( euler.order === 'XYZ' ) {
  1284. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1285. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1286. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1287. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1288. } else if ( euler.order === 'YXZ' ) {
  1289. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1290. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1291. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1292. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1293. } else if ( euler.order === 'ZXY' ) {
  1294. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1295. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1296. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1297. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1298. } else if ( euler.order === 'ZYX' ) {
  1299. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1300. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1301. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1302. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1303. } else if ( euler.order === 'YZX' ) {
  1304. this._x = s1 * c2 * c3 + c1 * s2 * s3;
  1305. this._y = c1 * s2 * c3 + s1 * c2 * s3;
  1306. this._z = c1 * c2 * s3 - s1 * s2 * c3;
  1307. this._w = c1 * c2 * c3 - s1 * s2 * s3;
  1308. } else if ( euler.order === 'XZY' ) {
  1309. this._x = s1 * c2 * c3 - c1 * s2 * s3;
  1310. this._y = c1 * s2 * c3 - s1 * c2 * s3;
  1311. this._z = c1 * c2 * s3 + s1 * s2 * c3;
  1312. this._w = c1 * c2 * c3 + s1 * s2 * s3;
  1313. }
  1314. if ( update !== false ) this.onChangeCallback();
  1315. return this;
  1316. },
  1317. setFromAxisAngle: function ( axis, angle ) {
  1318. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
  1319. // assumes axis is normalized
  1320. var halfAngle = angle / 2, s = Math.sin( halfAngle );
  1321. this._x = axis.x * s;
  1322. this._y = axis.y * s;
  1323. this._z = axis.z * s;
  1324. this._w = Math.cos( halfAngle );
  1325. this.onChangeCallback();
  1326. return this;
  1327. },
  1328. setFromRotationMatrix: function ( m ) {
  1329. // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
  1330. // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
  1331. var te = m.elements,
  1332. m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
  1333. m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
  1334. m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
  1335. trace = m11 + m22 + m33,
  1336. s;
  1337. if ( trace > 0 ) {
  1338. s = 0.5 / Math.sqrt( trace + 1.0 );
  1339. this._w = 0.25 / s;
  1340. this._x = ( m32 - m23 ) * s;
  1341. this._y = ( m13 - m31 ) * s;
  1342. this._z = ( m21 - m12 ) * s;
  1343. } else if ( m11 > m22 && m11 > m33 ) {
  1344. s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
  1345. this._w = ( m32 - m23 ) / s;
  1346. this._x = 0.25 * s;
  1347. this._y = ( m12 + m21 ) / s;
  1348. this._z = ( m13 + m31 ) / s;
  1349. } else if ( m22 > m33 ) {
  1350. s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
  1351. this._w = ( m13 - m31 ) / s;
  1352. this._x = ( m12 + m21 ) / s;
  1353. this._y = 0.25 * s;
  1354. this._z = ( m23 + m32 ) / s;
  1355. } else {
  1356. s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
  1357. this._w = ( m21 - m12 ) / s;
  1358. this._x = ( m13 + m31 ) / s;
  1359. this._y = ( m23 + m32 ) / s;
  1360. this._z = 0.25 * s;
  1361. }
  1362. this.onChangeCallback();
  1363. return this;
  1364. },
  1365. setFromUnitVectors: function () {
  1366. // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final
  1367. // assumes direction vectors vFrom and vTo are normalized
  1368. var v1, r;
  1369. var EPS = 0.000001;
  1370. return function ( vFrom, vTo ) {
  1371. if ( v1 === undefined ) v1 = new THREE.Vector3();
  1372. r = vFrom.dot( vTo ) + 1;
  1373. if ( r < EPS ) {
  1374. r = 0;
  1375. if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
  1376. v1.set( - vFrom.y, vFrom.x, 0 );
  1377. } else {
  1378. v1.set( 0, - vFrom.z, vFrom.y );
  1379. }
  1380. } else {
  1381. v1.crossVectors( vFrom, vTo );
  1382. }
  1383. this._x = v1.x;
  1384. this._y = v1.y;
  1385. this._z = v1.z;
  1386. this._w = r;
  1387. this.normalize();
  1388. return this;
  1389. }
  1390. }(),
  1391. inverse: function () {
  1392. this.conjugate().normalize();
  1393. return this;
  1394. },
  1395. conjugate: function () {
  1396. this._x *= - 1;
  1397. this._y *= - 1;
  1398. this._z *= - 1;
  1399. this.onChangeCallback();
  1400. return this;
  1401. },
  1402. dot: function ( v ) {
  1403. return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
  1404. },
  1405. lengthSq: function () {
  1406. return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
  1407. },
  1408. length: function () {
  1409. return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
  1410. },
  1411. normalize: function () {
  1412. var l = this.length();
  1413. if ( l === 0 ) {
  1414. this._x = 0;
  1415. this._y = 0;
  1416. this._z = 0;
  1417. this._w = 1;
  1418. } else {
  1419. l = 1 / l;
  1420. this._x = this._x * l;
  1421. this._y = this._y * l;
  1422. this._z = this._z * l;
  1423. this._w = this._w * l;
  1424. }
  1425. this.onChangeCallback();
  1426. return this;
  1427. },
  1428. multiply: function ( q, p ) {
  1429. if ( p !== undefined ) {
  1430. THREE.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
  1431. return this.multiplyQuaternions( q, p );
  1432. }
  1433. return this.multiplyQuaternions( this, q );
  1434. },
  1435. multiplyQuaternions: function ( a, b ) {
  1436. // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
  1437. var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
  1438. var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
  1439. this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
  1440. this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
  1441. this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
  1442. this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
  1443. this.onChangeCallback();
  1444. return this;
  1445. },
  1446. multiplyVector3: function ( vector ) {
  1447. THREE.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
  1448. return vector.applyQuaternion( this );
  1449. },
  1450. slerp: function ( qb, t ) {
  1451. if ( t === 0 ) return this;
  1452. if ( t === 1 ) return this.copy( qb );
  1453. var x = this._x, y = this._y, z = this._z, w = this._w;
  1454. // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
  1455. var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
  1456. if ( cosHalfTheta < 0 ) {
  1457. this._w = - qb._w;
  1458. this._x = - qb._x;
  1459. this._y = - qb._y;
  1460. this._z = - qb._z;
  1461. cosHalfTheta = - cosHalfTheta;
  1462. } else {
  1463. this.copy( qb );
  1464. }
  1465. if ( cosHalfTheta >= 1.0 ) {
  1466. this._w = w;
  1467. this._x = x;
  1468. this._y = y;
  1469. this._z = z;
  1470. return this;
  1471. }
  1472. var halfTheta = Math.acos( cosHalfTheta );
  1473. var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
  1474. if ( Math.abs( sinHalfTheta ) < 0.001 ) {
  1475. this._w = 0.5 * ( w + this._w );
  1476. this._x = 0.5 * ( x + this._x );
  1477. this._y = 0.5 * ( y + this._y );
  1478. this._z = 0.5 * ( z + this._z );
  1479. return this;
  1480. }
  1481. var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
  1482. ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
  1483. this._w = ( w * ratioA + this._w * ratioB );
  1484. this._x = ( x * ratioA + this._x * ratioB );
  1485. this._y = ( y * ratioA + this._y * ratioB );
  1486. this._z = ( z * ratioA + this._z * ratioB );
  1487. this.onChangeCallback();
  1488. return this;
  1489. },
  1490. equals: function ( quaternion ) {
  1491. return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
  1492. },
  1493. fromArray: function ( array, offset ) {
  1494. if ( offset === undefined ) offset = 0;
  1495. this._x = array[ offset ];
  1496. this._y = array[ offset + 1 ];
  1497. this._z = array[ offset + 2 ];
  1498. this._w = array[ offset + 3 ];
  1499. this.onChangeCallback();
  1500. return this;
  1501. },
  1502. toArray: function ( array, offset ) {
  1503. if ( array === undefined ) array = [];
  1504. if ( offset === undefined ) offset = 0;
  1505. array[ offset ] = this._x;
  1506. array[ offset + 1 ] = this._y;
  1507. array[ offset + 2 ] = this._z;
  1508. array[ offset + 3 ] = this._w;
  1509. return array;
  1510. },
  1511. onChange: function ( callback ) {
  1512. this.onChangeCallback = callback;
  1513. return this;
  1514. },
  1515. onChangeCallback: function () {},
  1516. clone: function () {
  1517. return new THREE.Quaternion( this._x, this._y, this._z, this._w );
  1518. }
  1519. };
  1520. THREE.Quaternion.slerp = function ( qa, qb, qm, t ) {
  1521. return qm.copy( qa ).slerp( qb, t );
  1522. }
  1523. },{}],13:[function(require,module,exports){
  1524. /**
  1525. * @author mrdoob / http://mrdoob.com/
  1526. * @author *kile / http://kile.stravaganza.org/
  1527. * @author philogb / http://blog.thejit.org/
  1528. * @author mikael emtinger / http://gomo.se/
  1529. * @author egraether / http://egraether.com/
  1530. * @author WestLangley / http://github.com/WestLangley
  1531. */
  1532. THREE.Vector3 = function ( x, y, z ) {
  1533. this.x = x || 0;
  1534. this.y = y || 0;
  1535. this.z = z || 0;
  1536. };
  1537. THREE.Vector3.prototype = {
  1538. constructor: THREE.Vector3,
  1539. set: function ( x, y, z ) {
  1540. this.x = x;
  1541. this.y = y;
  1542. this.z = z;
  1543. return this;
  1544. },
  1545. setX: function ( x ) {
  1546. this.x = x;
  1547. return this;
  1548. },
  1549. setY: function ( y ) {
  1550. this.y = y;
  1551. return this;
  1552. },
  1553. setZ: function ( z ) {
  1554. this.z = z;
  1555. return this;
  1556. },
  1557. setComponent: function ( index, value ) {
  1558. switch ( index ) {
  1559. case 0: this.x = value; break;
  1560. case 1: this.y = value; break;
  1561. case 2: this.z = value; break;
  1562. default: throw new Error( 'index is out of range: ' + index );
  1563. }
  1564. },
  1565. getComponent: function ( index ) {
  1566. switch ( index ) {
  1567. case 0: return this.x;
  1568. case 1: return this.y;
  1569. case 2: return this.z;
  1570. default: throw new Error( 'index is out of range: ' + index );
  1571. }
  1572. },
  1573. copy: function ( v ) {
  1574. this.x = v.x;
  1575. this.y = v.y;
  1576. this.z = v.z;
  1577. return this;
  1578. },
  1579. add: function ( v, w ) {
  1580. if ( w !== undefined ) {
  1581. THREE.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
  1582. return this.addVectors( v, w );
  1583. }
  1584. this.x += v.x;
  1585. this.y += v.y;
  1586. this.z += v.z;
  1587. return this;
  1588. },
  1589. addScalar: function ( s ) {
  1590. this.x += s;
  1591. this.y += s;
  1592. this.z += s;
  1593. return this;
  1594. },
  1595. addVectors: function ( a, b ) {
  1596. this.x = a.x + b.x;
  1597. this.y = a.y + b.y;
  1598. this.z = a.z + b.z;
  1599. return this;
  1600. },
  1601. sub: function ( v, w ) {
  1602. if ( w !== undefined ) {
  1603. THREE.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
  1604. return this.subVectors( v, w );
  1605. }
  1606. this.x -= v.x;
  1607. this.y -= v.y;
  1608. this.z -= v.z;
  1609. return this;
  1610. },
  1611. subScalar: function ( s ) {
  1612. this.x -= s;
  1613. this.y -= s;
  1614. this.z -= s;
  1615. return this;
  1616. },
  1617. subVectors: function ( a, b ) {
  1618. this.x = a.x - b.x;
  1619. this.y = a.y - b.y;
  1620. this.z = a.z - b.z;
  1621. return this;
  1622. },
  1623. multiply: function ( v, w ) {
  1624. if ( w !== undefined ) {
  1625. THREE.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
  1626. return this.multiplyVectors( v, w );
  1627. }
  1628. this.x *= v.x;
  1629. this.y *= v.y;
  1630. this.z *= v.z;
  1631. return this;
  1632. },
  1633. multiplyScalar: function ( scalar ) {
  1634. this.x *= scalar;
  1635. this.y *= scalar;
  1636. this.z *= scalar;
  1637. return this;
  1638. },
  1639. multiplyVectors: function ( a, b ) {
  1640. this.x = a.x * b.x;
  1641. this.y = a.y * b.y;
  1642. this.z = a.z * b.z;
  1643. return this;
  1644. },
  1645. applyEuler: function () {
  1646. var quaternion;
  1647. return function ( euler ) {
  1648. if ( euler instanceof THREE.Euler === false ) {
  1649. THREE.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' );
  1650. }
  1651. if ( quaternion === undefined ) quaternion = new THREE.Quaternion();
  1652. this.applyQuaternion( quaternion.setFromEuler( euler ) );
  1653. return this;
  1654. };
  1655. }(),
  1656. applyAxisAngle: function () {
  1657. var quaternion;
  1658. return function ( axis, angle ) {
  1659. if ( quaternion === undefined ) quaternion = new THREE.Quaternion();
  1660. this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
  1661. return this;
  1662. };
  1663. }(),
  1664. applyMatrix3: function ( m ) {
  1665. var x = this.x;
  1666. var y = this.y;
  1667. var z = this.z;
  1668. var e = m.elements;
  1669. this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
  1670. this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
  1671. this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
  1672. return this;
  1673. },
  1674. applyMatrix4: function ( m ) {
  1675. // input: THREE.Matrix4 affine matrix
  1676. var x = this.x, y = this.y, z = this.z;
  1677. var e = m.elements;
  1678. this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];
  1679. this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];
  1680. this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];
  1681. return this;
  1682. },
  1683. applyProjection: function ( m ) {
  1684. // input: THREE.Matrix4 projection matrix
  1685. var x = this.x, y = this.y, z = this.z;
  1686. var e = m.elements;
  1687. var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide
  1688. this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;
  1689. this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;
  1690. this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;
  1691. return this;
  1692. },
  1693. applyQuaternion: function ( q ) {
  1694. var x = this.x;
  1695. var y = this.y;
  1696. var z = this.z;
  1697. var qx = q.x;
  1698. var qy = q.y;
  1699. var qz = q.z;
  1700. var qw = q.w;
  1701. // calculate quat * vector
  1702. var ix = qw * x + qy * z - qz * y;
  1703. var iy = qw * y + qz * x - qx * z;
  1704. var iz = qw * z + qx * y - qy * x;
  1705. var iw = - qx * x - qy * y - qz * z;
  1706. // calculate result * inverse quat
  1707. this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
  1708. this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
  1709. this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
  1710. return this;
  1711. },
  1712. project: function () {
  1713. var matrix;
  1714. return function ( camera ) {
  1715. if ( matrix === undefined ) matrix = new THREE.Matrix4();
  1716. matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
  1717. return this.applyProjection( matrix );
  1718. };
  1719. }(),
  1720. unproject: function () {
  1721. var matrix;
  1722. return function ( camera ) {
  1723. if ( matrix === undefined ) matrix = new THREE.Matrix4();
  1724. matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
  1725. return this.applyProjection( matrix );
  1726. };
  1727. }(),
  1728. transformDirection: function ( m ) {
  1729. // input: THREE.Matrix4 affine matrix
  1730. // vector interpreted as a direction
  1731. var x = this.x, y = this.y, z = this.z;
  1732. var e = m.elements;
  1733. this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
  1734. this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
  1735. this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
  1736. this.normalize();
  1737. return this;
  1738. },
  1739. divide: function ( v ) {
  1740. this.x /= v.x;
  1741. this.y /= v.y;
  1742. this.z /= v.z;
  1743. return this;
  1744. },
  1745. divideScalar: function ( scalar ) {
  1746. if ( scalar !== 0 ) {
  1747. var invScalar = 1 / scalar;
  1748. this.x *= invScalar;
  1749. this.y *= invScalar;
  1750. this.z *= invScalar;
  1751. } else {
  1752. this.x = 0;
  1753. this.y = 0;
  1754. this.z = 0;
  1755. }
  1756. return this;
  1757. },
  1758. min: function ( v ) {
  1759. if ( this.x > v.x ) {
  1760. this.x = v.x;
  1761. }
  1762. if ( this.y > v.y ) {
  1763. this.y = v.y;
  1764. }
  1765. if ( this.z > v.z ) {
  1766. this.z = v.z;
  1767. }
  1768. return this;
  1769. },
  1770. max: function ( v ) {
  1771. if ( this.x < v.x ) {
  1772. this.x = v.x;
  1773. }
  1774. if ( this.y < v.y ) {
  1775. this.y = v.y;
  1776. }
  1777. if ( this.z < v.z ) {
  1778. this.z = v.z;
  1779. }
  1780. return this;
  1781. },
  1782. clamp: function ( min, max ) {
  1783. // This function assumes min < max, if this assumption isn't true it will not operate correctly
  1784. if ( this.x < min.x ) {
  1785. this.x = min.x;
  1786. } else if ( this.x > max.x ) {
  1787. this.x = max.x;
  1788. }
  1789. if ( this.y < min.y ) {
  1790. this.y = min.y;
  1791. } else if ( this.y > max.y ) {
  1792. this.y = max.y;
  1793. }
  1794. if ( this.z < min.z ) {
  1795. this.z = min.z;
  1796. } else if ( this.z > max.z ) {
  1797. this.z = max.z;
  1798. }
  1799. return this;
  1800. },
  1801. clampScalar: ( function () {
  1802. var min, max;
  1803. return function ( minVal, maxVal ) {
  1804. if ( min === undefined ) {
  1805. min = new THREE.Vector3();
  1806. max = new THREE.Vector3();
  1807. }
  1808. min.set( minVal, minVal, minVal );
  1809. max.set( maxVal, maxVal, maxVal );
  1810. return this.clamp( min, max );
  1811. };
  1812. } )(),
  1813. floor: function () {
  1814. this.x = Math.floor( this.x );
  1815. this.y = Math.floor( this.y );
  1816. this.z = Math.floor( this.z );
  1817. return this;
  1818. },
  1819. ceil: function () {
  1820. this.x = Math.ceil( this.x );
  1821. this.y = Math.ceil( this.y );
  1822. this.z = Math.ceil( this.z );
  1823. return this;
  1824. },
  1825. round: function () {
  1826. this.x = Math.round( this.x );
  1827. this.y = Math.round( this.y );
  1828. this.z = Math.round( this.z );
  1829. return this;
  1830. },
  1831. roundToZero: function () {
  1832. this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
  1833. this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
  1834. this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
  1835. return this;
  1836. },
  1837. negate: function () {
  1838. this.x = - this.x;
  1839. this.y = - this.y;
  1840. this.z = - this.z;
  1841. return this;
  1842. },
  1843. dot: function ( v ) {
  1844. return this.x * v.x + this.y * v.y + this.z * v.z;
  1845. },
  1846. lengthSq: function () {
  1847. return this.x * this.x + this.y * this.y + this.z * this.z;
  1848. },
  1849. length: function () {
  1850. return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
  1851. },
  1852. lengthManhattan: function () {
  1853. return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
  1854. },
  1855. normalize: function () {
  1856. return this.divideScalar( this.length() );
  1857. },
  1858. setLength: function ( l ) {
  1859. var oldLength = this.length();
  1860. if ( oldLength !== 0 && l !== oldLength ) {
  1861. this.multiplyScalar( l / oldLength );
  1862. }
  1863. return this;
  1864. },
  1865. lerp: function ( v, alpha ) {
  1866. this.x += ( v.x - this.x ) * alpha;
  1867. this.y += ( v.y - this.y ) * alpha;
  1868. this.z += ( v.z - this.z ) * alpha;
  1869. return this;
  1870. },
  1871. lerpVectors: function ( v1, v2, alpha ) {
  1872. this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
  1873. return this;
  1874. },
  1875. cross: function ( v, w ) {
  1876. if ( w !== undefined ) {
  1877. THREE.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
  1878. return this.crossVectors( v, w );
  1879. }
  1880. var x = this.x, y = this.y, z = this.z;
  1881. this.x = y * v.z - z * v.y;
  1882. this.y = z * v.x - x * v.z;
  1883. this.z = x * v.y - y * v.x;
  1884. return this;
  1885. },
  1886. crossVectors: function ( a, b ) {
  1887. var ax = a.x, ay = a.y, az = a.z;
  1888. var bx = b.x, by = b.y, bz = b.z;
  1889. this.x = ay * bz - az * by;
  1890. this.y = az * bx - ax * bz;
  1891. this.z = ax * by - ay * bx;
  1892. return this;
  1893. },
  1894. projectOnVector: function () {
  1895. var v1, dot;
  1896. return function ( vector ) {
  1897. if ( v1 === undefined ) v1 = new THREE.Vector3();
  1898. v1.copy( vector ).normalize();
  1899. dot = this.dot( v1 );
  1900. return this.copy( v1 ).multiplyScalar( dot );
  1901. };
  1902. }(),
  1903. projectOnPlane: function () {
  1904. var v1;
  1905. return function ( planeNormal ) {
  1906. if ( v1 === undefined ) v1 = new THREE.Vector3();
  1907. v1.copy( this ).projectOnVector( planeNormal );
  1908. return this.sub( v1 );
  1909. }
  1910. }(),
  1911. reflect: function () {
  1912. // reflect incident vector off plane orthogonal to normal
  1913. // normal is assumed to have unit length
  1914. var v1;
  1915. return function ( normal ) {
  1916. if ( v1 === undefined ) v1 = new THREE.Vector3();
  1917. return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
  1918. }
  1919. }(),
  1920. angleTo: function ( v ) {
  1921. var theta = this.dot( v ) / ( this.length() * v.length() );
  1922. // clamp, to handle numerical problems
  1923. return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) );
  1924. },
  1925. distanceTo: function ( v ) {
  1926. return Math.sqrt( this.distanceToSquared( v ) );
  1927. },
  1928. distanceToSquared: function ( v ) {
  1929. var dx = this.x - v.x;
  1930. var dy = this.y - v.y;
  1931. var dz = this.z - v.z;
  1932. return dx * dx + dy * dy + dz * dz;
  1933. },
  1934. setEulerFromRotationMatrix: function ( m, order ) {
  1935. THREE.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
  1936. },
  1937. setEulerFromQuaternion: function ( q, order ) {
  1938. THREE.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
  1939. },
  1940. getPositionFromMatrix: function ( m ) {
  1941. THREE.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
  1942. return this.setFromMatrixPosition( m );
  1943. },
  1944. getScaleFromMatrix: function ( m ) {
  1945. THREE.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
  1946. return this.setFromMatrixScale( m );
  1947. },
  1948. getColumnFromMatrix: function ( index, matrix ) {
  1949. THREE.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
  1950. return this.setFromMatrixColumn( index, matrix );
  1951. },
  1952. setFromMatrixPosition: function ( m ) {
  1953. this.x = m.elements[ 12 ];
  1954. this.y = m.elements[ 13 ];
  1955. this.z = m.elements[ 14 ];
  1956. return this;
  1957. },
  1958. setFromMatrixScale: function ( m ) {
  1959. var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length();
  1960. var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length();
  1961. var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length();
  1962. this.x = sx;
  1963. this.y = sy;
  1964. this.z = sz;
  1965. return this;
  1966. },
  1967. setFromMatrixColumn: function ( index, matrix ) {
  1968. var offset = index * 4;
  1969. var me = matrix.elements;
  1970. this.x = me[ offset ];
  1971. this.y = me[ offset + 1 ];
  1972. this.z = me[ offset + 2 ];
  1973. return this;
  1974. },
  1975. equals: function ( v ) {
  1976. return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
  1977. },
  1978. fromArray: function ( array, offset ) {
  1979. if ( offset === undefined ) offset = 0;
  1980. this.x = array[ offset ];
  1981. this.y = array[ offset + 1 ];
  1982. this.z = array[ offset + 2 ];
  1983. return this;
  1984. },
  1985. toArray: function ( array, offset ) {
  1986. if ( array === undefined ) array = [];
  1987. if ( offset === undefined ) offset = 0;
  1988. array[ offset ] = this.x;
  1989. array[ offset + 1 ] = this.y;
  1990. array[ offset + 2 ] = this.z;
  1991. return array;
  1992. },
  1993. fromAttribute: function ( attribute, index, offset ) {
  1994. if ( offset === undefined ) offset = 0;
  1995. index = index * attribute.itemSize + offset;
  1996. this.x = attribute.array[ index ];
  1997. this.y = attribute.array[ index + 1 ];
  1998. this.z = attribute.array[ index + 2 ];
  1999. return this;
  2000. },
  2001. clone: function () {
  2002. return new THREE.Vector3( this.x, this.y, this.z );
  2003. }
  2004. };
  2005. },{}]},{},[1])
  2006. //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvQXBwLmpzIiwic3JjL0NlbGVzdGlhbEJvZHkuanMiLCJzcmMvRGVmaW5pdGlvbnMuanMiLCJzcmMvTWF0aC5qcyIsInNyYy9Nb29uUmVhbE9yYml0LmpzIiwic3JjL05hbWVTcGFjZS5qcyIsInNyYy9PcmJpdGFsRWxlbWVudHMuanMiLCJzcmMvU29sYXJTeXN0ZW0uanMiLCJzcmMvVGhyZWUuc2hpbS5qcyIsInNyYy9VdGlscy5qcyIsInZlbmRvci90aHJlZS9tYXRoL0V1bGVyLmpzIiwidmVuZG9yL3RocmVlL21hdGgvUXVhdGVybmlvbi5qcyIsInZlbmRvci90aHJlZS9tYXRoL1ZlY3RvcjMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlxuJ3VzZSBzdHJpY3QnO1xudmFyIFNvbGFyU3lzdGVtID0gcmVxdWlyZSgnLi9Tb2xhclN5c3RlbScpO1xuXG5cbnZhciBnbG9iYWwgPSB3aW5kb3cubGFncmFuZ2UgPSB3aW5kb3cubGFncmFuZ2UgfHwge307XG5cbmdsb2JhbC5wbGFuZXRfcG9zaXRpb25zID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdGdldFBvc2l0aW9uczogZnVuY3Rpb24odXNlckRhdGUpe1xuXHRcdHJldHVybiBTb2xhclN5c3RlbS5nZXRQb3NpdGlvbnModXNlckRhdGUpO1xuXHR9XG59OyIsIlxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgT3JiaXRhbEVsZW1lbnRzID0gcmVxdWlyZSgnLi9PcmJpdGFsRWxlbWVudHMnKTtcclxudmFyIG5zID0gcmVxdWlyZSgnbnMnKTtcclxudmFyIFRIUkVFID0gcmVxdWlyZSgnLi9UaHJlZS5zaGltJyk7XHJcblxyXG52YXIgQ2VsZXN0aWFsQm9keSA9IHtcclxuXHJcblx0aW5pdCA6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5yZXNldCgpO1xyXG5cdFx0dGhpcy5tb3ZlbWVudCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcblx0XHR0aGlzLmludk1hc3MgPSAxIC8gdGhpcy5tYXNzO1xyXG5cclxuXHRcdHRoaXMub3JiaXRhbEVsZW1lbnRzID0gT2JqZWN0LmNyZWF0ZShPcmJpdGFsRWxlbWVudHMpO1xyXG5cdFx0dGhpcy5vcmJpdGFsRWxlbWVudHMuc2V0TmFtZSh0aGlzLm5hbWUpO1xyXG5cdFx0dGhpcy5vcmJpdGFsRWxlbWVudHMuc2V0RGVmYXVsdE9yYml0KHRoaXMub3JiaXQsIHRoaXMub3JiaXRDYWxjdWxhdG9yKTtcclxuXHRcdC8vY29uc29sZS5sb2codGhpcy5uYW1lLCB0aGlzLnBvc2l0aW9uLCB0aGlzLnZlbG9jaXR5KTtcclxuXHJcblx0fSxcclxuXHJcblx0cmVzZXQgOiBmdW5jdGlvbigpe1xyXG5cdFx0dGhpcy5hbmdsZSA9IDA7XHJcblx0XHR0aGlzLmZvcmNlID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuXHRcdHRoaXMubW92ZW1lbnQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cdFx0dGhpcy5wcmV2aW91c1Bvc2l0aW9uID0gbnVsbDtcclxuXHR9LFxyXG5cclxuXHQvL2lmIGVwb2NoIHN0YXJ0IGlzIG5vdCBqMjAwMCwgZ2V0IGVwb2NoIHRpbWUgZnJvbSBqMjAwMCBlcG9jaCB0aW1lXHJcblx0Z2V0RXBvY2hUaW1lIDogZnVuY3Rpb24oZXBvY2hUaW1lKSB7XHJcblx0XHRpZih0aGlzLmVwb2NoKSB7XHJcblx0XHRcdGVwb2NoVGltZSA9IGVwb2NoVGltZSAtICgodGhpcy5lcG9jaC5nZXRUaW1lKCkgLSBucy5KMjAwMCkgLyAxMDAwKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBlcG9jaFRpbWU7XHJcblx0fSxcclxuXHJcblx0c2V0UG9zaXRpb25Gcm9tRGF0ZSA6IGZ1bmN0aW9uKGVwb2NoVGltZSwgY2FsY3VsYXRlVmVsb2NpdHkpIHtcclxuXHJcblx0XHRlcG9jaFRpbWUgPSB0aGlzLmdldEVwb2NoVGltZShlcG9jaFRpbWUpO1xyXG5cdFx0dGhpcy5wb3NpdGlvbiA9IHRoaXMuaXNDZW50cmFsID8gbmV3IFRIUkVFLlZlY3RvcjMoKSA6IHRoaXMub3JiaXRhbEVsZW1lbnRzLmdldFBvc2l0aW9uRnJvbUVsZW1lbnRzKHRoaXMub3JiaXRhbEVsZW1lbnRzLmNhbGN1bGF0ZUVsZW1lbnRzKGVwb2NoVGltZSkpO1xyXG5cdFx0dGhpcy5yZWxhdGl2ZVBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuXHRcdGlmKGNhbGN1bGF0ZVZlbG9jaXR5KSB7XHJcblx0XHRcdHRoaXMudmVsb2NpdHkgPSB0aGlzLmlzQ2VudHJhbCA/IG5ldyBUSFJFRS5WZWN0b3IzKCkgOiB0aGlzLm9yYml0YWxFbGVtZW50cy5jYWxjdWxhdGVWZWxvY2l0eShlcG9jaFRpbWUsIHRoaXMucmVsYXRpdmVUbywgdGhpcy5jYWxjdWxhdGVGcm9tRWxlbWVudHMpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5wb3NpdGlvblJlbGF0aXZlVG8oKTtcdFx0XHJcblx0fSxcclxuXHRcclxuXHRnZXRBbmdsZVRvIDogZnVuY3Rpb24oYm9keU5hbWUpe1xyXG5cdFx0dmFyIHJlZiA9IHJlcXVpcmUoJy4vU29sYXJTeXN0ZW0nKS5nZXRCb2R5KGJvZHlOYW1lKTtcclxuXHRcdGlmKHJlZikge1xyXG5cdFx0XHRcclxuXHRcdFx0dmFyIGVjbFBvcyA9IHRoaXMucG9zaXRpb24uY2xvbmUoKS5zdWIocmVmLmdldFBvc2l0aW9uKCkpLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRlY2xQb3MueiA9IDA7XHJcblx0XHRcdHZhciBhbmdsZVggPSBlY2xQb3MuYW5nbGVUbyhuZXcgVEhSRUUuVmVjdG9yMygxLCAwLCAwKSk7XHJcblx0XHRcdHZhciBhbmdsZVkgPSBlY2xQb3MuYW5nbGVUbyhuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSk7XHJcblx0XHRcdC8vY29uc29sZS5sb2coYW5nbGVYLCBhbmdsZVkpO1xyXG5cdFx0XHR2YXIgYW5nbGUgPSBhbmdsZVg7XHJcblx0XHRcdHZhciBxID0gTWF0aC5QSSAvIDI7XHJcblx0XHRcdGlmKGFuZ2xlWSA+IHEpIGFuZ2xlID0gLWFuZ2xlWDtcclxuXHRcdFx0cmV0dXJuIGFuZ2xlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDA7XHJcblx0fSxcclxuXHJcblx0cG9zaXRpb25SZWxhdGl2ZVRvIDogZnVuY3Rpb24oKXtcclxuXHRcdGlmKHRoaXMucmVsYXRpdmVUbykge1xyXG5cdFx0XHR2YXIgY2VudHJhbCA9IHJlcXVpcmUoJy4vU29sYXJTeXN0ZW0nKS5nZXRCb2R5KHRoaXMucmVsYXRpdmVUbyk7XHJcblx0XHRcdGlmKGNlbnRyYWwgJiYgY2VudHJhbCE9PXJlcXVpcmUoJy4vU29sYXJTeXN0ZW0nKS5nZXRCb2R5KCkvKiovKSB7XHJcblx0XHRcdFx0dGhpcy5wb3NpdGlvbi5hZGQoY2VudHJhbC5wb3NpdGlvbik7XHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyh0aGlzLm5hbWUrJyBwb3MgcmVsIHRvICcgKyB0aGlzLnJlbGF0aXZlVG8pO1xyXG5cdFx0XHRcdHRoaXMudmVsb2NpdHkgJiYgY2VudHJhbC52ZWxvY2l0eSAmJiB0aGlzLnZlbG9jaXR5LmFkZChjZW50cmFsLnZlbG9jaXR5KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGNhbGN1bGF0ZVBvc2l0aW9uIDogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuIHRoaXMub3JiaXRhbEVsZW1lbnRzLmNhbGN1bGF0ZVBvc2l0aW9uKHQpO1xyXG5cdH0sXHJcblxyXG5cdGdldFBvc2l0aW9uIDogZnVuY3Rpb24oKXtcclxuXHRcdHJldHVybiB0aGlzLnBvc2l0aW9uLmNsb25lKCk7XHJcblx0fSxcclxuXHJcblx0Z2V0VmVsb2NpdHkgOiBmdW5jdGlvbigpe1xyXG5cdFx0cmV0dXJuIHRoaXMudmVsb2NpdHkgJiYgdGhpcy52ZWxvY2l0eS5jbG9uZSgpO1xyXG5cdH0sXHJcblx0Ly9yZXR1cm4gdHJ1ZS9mYWxzZSBpZiB0aGlzIGJvZHkgaXMgb3JiaXRpbmcgdGhlIHJlcXVlc3RlZCBib2R5XHJcblx0aXNPcmJpdEFyb3VuZCA6IGZ1bmN0aW9uKGNlbGVzdGlhbCl7XHJcblx0XHRyZXR1cm4gY2VsZXN0aWFsLm5hbWUgPT09IHRoaXMucmVsYXRpdmVUbztcclxuXHR9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENlbGVzdGlhbEJvZHk7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxudmFyIG5zID0gcmVxdWlyZSgnbnMnKTtcclxudmFyIE1vb25SZWFsT3JiaXQgPSByZXF1aXJlKCcuL01vb25SZWFsT3JiaXQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gW1xyXG5cdHtcclxuXHRcdG5hbWU6ICdzdW4nLFxyXG5cdFx0dGl0bGUgOiAnVGhlIFN1bicsXHJcblx0XHRtYXNzIDogMS45ODkxZTMwLFxyXG5cdFx0cmFkaXVzIDogNi45NjM0MmU1LFxyXG5cdFx0ayA6IDAuMDE3MjAyMDk4OTUgLy9ncmF2aXRhdGlvbmFsIGNvbnN0YW50ICjOvClcclxuXHR9LFxyXG5cdHtcclxuXHQgXHRuYW1lOiAnbWVyY3VyeScsXHJcblx0XHR0aXRsZSA6ICdNZXJjdXJ5JyxcclxuXHRcdG1hc3MgOiAzLjMwMjJlMjMsXHJcblx0XHRyYWRpdXM6MjQzOSxcclxuXHRcdG9yYml0IDogeyBcclxuXHRcdFx0YmFzZSA6IHthIDogMC4zODcwOTkyNyAqIG5zLkFVICwgIGUgOiAwLjIwNTYzNTkzLCBpOiA3LjAwNDk3OTAyLCBsIDogMjUyLjI1MDMyMzUwLCBscCA6IDc3LjQ1Nzc5NjI4LCBvIDogNDguMzMwNzY1OTN9LFxyXG5cdFx0XHRjeSA6IHthIDogMC4wMDAwMDAzNyAqIG5zLkFVICwgIGUgOiAwLjAwMDAxOTA2LCBpOiAtMC4wMDU5NDc0OSwgbCA6IDE0OTQ3Mi42NzQxMTE3NSwgbHAgOiAwLjE2MDQ3Njg5LCBvIDogLTAuMTI1MzQwODF9XHJcblx0XHR9XHJcblx0fSxcclxuXHR7XHJcblx0XHRuYW1lOiAndmVudXMnLFxyXG5cdFx0dGl0bGUgOiAnVmVudXMnLFxyXG5cdFx0bWFzcyA6IDQuODY4ZTI0LFxyXG5cdFx0cmFkaXVzIDogNjA1MSxcclxuXHRcdG9yYml0IDoge1xyXG5cdFx0XHRiYXNlIDoge2EgOiAwLjcyMzMzNTY2ICogbnMuQVUgLCAgZSA6IDAuMDA2Nzc2NzIsIGk6IDMuMzk0Njc2MDUsIGwgOiAxODEuOTc5MDk5NTAsIGxwIDogMTMxLjYwMjQ2NzE4LCBvIDogNzYuNjc5ODQyNTV9LFxyXG5cdFx0XHRjeSA6IHthIDogMC4wMDAwMDM5MCAqIG5zLkFVICwgIGUgOiAtMC4wMDAwNDEwNywgaTogLTAuMDAwNzg4OTAsIGwgOiA1ODUxNy44MTUzODcyOSwgbHAgOiAwLjAwMjY4MzI5LCBvIDogLTAuMjc3Njk0MTh9XHJcblx0XHR9XHJcblx0fSxcclxuXHR7XHJcblx0XHRuYW1lOidlYXJ0aCcsXHJcblx0XHR0aXRsZSA6ICdUaGUgRWFydGgnLFxyXG5cdFx0bWFzcyA6IDUuOTczNmUyNCxcclxuXHRcdHJhZGl1cyA6IDM0NDMuOTMwNyAqIG5zLk5NX1RPX0tNLFxyXG5cdFx0c2lkZXJhbERheSA6IG5zLlNJREVSQUxfREFZLFxyXG5cdFx0dGlsdCA6IDIzKygyNi82MCkrKDIxLzM2MDApICxcclxuXHRcdG9yYml0IDoge1xyXG5cdFx0XHRiYXNlIDoge2EgOiAxLjAwMDAwMjYxICogbnMuQVUsIGUgOiAwLjAxNjcxMTIzLCBpIDogLTAuMDAwMDE1MzEsIGwgOiAxMDAuNDY0NTcxNjYsIGxwIDogMTAyLjkzNzY4MTkzLCBvIDogMC4wfSxcclxuXHRcdFx0Y3kgOiB7YSA6IDAuMDAwMDA1NjIgKiBucy5BVSwgZSA6IC0wLjAwMDA0MzkyLCBpIDogLTAuMDEyOTQ2NjgsIGwgOiAzNTk5OS4zNzI0NDk4MSwgbHAgOiAwLjMyMzI3MzY0LCBvIDogMC4wfVxyXG5cdFx0fVxyXG5cdH0sXHJcblx0e1xyXG5cdFx0bmFtZTonbWFycycsXHJcblx0XHR0aXRsZSA6ICdNYXJzJyxcclxuXHRcdG1hc3MgOiA2LjQxODVlMjMsXHJcblx0XHRyYWRpdXMgOiAzMzc2LFxyXG5cdFx0c2lkZXJhbERheSA6IDEuMDI1OTU3ICogbnMuREFZLFxyXG5cdFx0b3JiaXQgOiB7XHJcblx0XHRcdGJhc2UgOiB7YSA6IDEuNTIzNzEwMzQgKiBucy5BVSAsICBlIDogMC4wOTMzOTQxMCwgaTogMS44NDk2OTE0MiwgbCA6IC00LjU1MzQzMjA1LCBscCA6IC0yMy45NDM2Mjk1OSwgbyA6IDQ5LjU1OTUzODkxfSxcclxuXHRcdFx0Y3kgOiB7YSA6IDAuMDAwMDE4NDcgKiBucy5BVSAsICBlIDogMC4wMDAwNzg4MiwgaTogLTAuMDA4MTMxMzEsIGwgOiAxOTE0MC4zMDI2ODQ5OSwgbHAgOiAwLjQ0NDQxMDg4LCBvIDogLTAuMjkyNTczNDN9XHJcblx0XHR9XHJcblx0fSxcclxuXHR7XHJcblx0IFx0bmFtZTonanVwaXRlcicsXHJcblx0XHR0aXRsZSA6ICdKdXBpdGVyJyxcclxuXHRcdG1hc3MgOiAxLjg5ODZlMjcsXHJcblx0XHRyYWRpdXMgOiA3MTQ5MixcclxuXHRcdG9yYml0IDoge1xyXG5cdFx0XHRiYXNlIDoge2EgOiA1LjIwMjg4NzAwICogbnMuQVUgLCAgZSA6IDAuMDQ4Mzg2MjQsIGk6IDEuMzA0Mzk2OTUsIGwgOiAzNC4zOTY0NDA1MSwgbHAgOiAxNC43Mjg0Nzk4MywgbyA6IDEwMC40NzM5MDkwOX0sXHJcblx0XHRcdGN5IDoge2EgOiAtMC4wMDAxMTYwNyAqIG5zLkFVICwgIGUgOiAtMC4wMDAxMzI1MywgaTogLTAuMDAxODM3MTQsIGwgOiAzMDM0Ljc0NjEyNzc1LCBscCA6IDAuMjEyNTI2NjgsIG8gOiAwLjIwNDY5MTA2fVxyXG5cdFx0fVxyXG5cdH0sXHJcblx0e1xyXG5cdFx0bmFtZTonc2F0dXJuJyxcclxuXHRcdHRpdGxlIDogJ1NhdHVybicsXHJcblx0XHRtYXNzIDogNS42ODQ2ZTI2LFxyXG5cdFx0cmFkaXVzIDogNTgyMzIsXHJcblx0XHR0aWx0IDogMjYuNyxcclxuXHRcdG9yYml0IDoge1xyXG5cdFx0XHRiYXNlIDoge2EgOiA5LjUzNjY3NTk0ICogbnMuQVUgLCAgZSA6IDAuMDUzODYxNzksIGk6IDIuNDg1OTkxODcsIGwgOiA0OS45NTQyNDQyMywgbHAgOiA5Mi41OTg4NzgzMSwgbyA6IDExMy42NjI0MjQ0OH0sXHJcblx0XHRcdGN5IDoge2EgOiAtMC4wMDEyNTA2MCAqIG5zLkFVICwgIGUgOiAtMC4wMDA1MDk5MSwgaTogMC4wMDE5MzYwOSwgbCA6IDEyMjIuNDkzNjIyMDEsIGxwIDogLTAuNDE4OTcyMTYsIG8gOiAtMC4yODg2Nzc5NH1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHtcclxuXHRcdG5hbWU6ICd1cmFudXMnLFxyXG5cdFx0dGl0bGUgOiAnVXJhbnVzJyxcclxuXHRcdG1hc3MgOiA4LjY4MTBlMjUsXHJcblx0XHRyYWRpdXMgOiAyNTU1OSxcclxuXHRcdG9yYml0IDoge1xyXG5cdFx0XHRiYXNlIDoge2EgOiAxOS4xODkxNjQ2NCAqIG5zLkFVICwgIGUgOiAwLjA0NzI1NzQ0LCBpOiAwLjc3MjYzNzgzLCBsIDogMzEzLjIzODEwNDUxLCBscCA6IDE3MC45NTQyNzYzMCwgbyA6IDc0LjAxNjkyNTAzfSxcclxuXHRcdFx0Y3kgOiB7YSA6IC0wLjAwMTk2MTc2ICogbnMuQVUgLCAgZSA6IC0wLjAwMDA0Mzk3LCBpOiAtMC4wMDI0MjkzOSwgbCA6IDQyOC40ODIwMjc4NSwgbHAgOiAwLjQwODA1MjgxLCBvIDogMC4wNDI0MDU4OX1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHtcclxuXHRcdG5hbWU6J25lcHR1bmUnLFxyXG5cdFx0dGl0bGUgOiAnTmVwdHVuZScsXHJcblx0XHRtYXNzIDogMS4wMjQzZTI2LFxyXG5cdFx0cmFkaXVzIDogMjQ3NjQsXHJcblx0XHRvcmJpdCA6IHtcclxuXHRcdFx0YmFzZSA6IHthIDogMzAuMDY5OTIyNzYgICogbnMuQVUsICBlIDogMC4wMDg1OTA0OCwgaTogMS43NzAwNDM0NywgbCA6IC01NS4xMjAwMjk2OSwgbHAgOiA0NC45NjQ3NjIyNywgbyA6IDEzMS43ODQyMjU3NH0sXHJcblx0XHRcdGN5IDoge2EgOiAwLjAwMDI2MjkxICAqIG5zLkFVLCAgZSA6IDAuMDAwMDUxMDUsIGk6IDAuMDAwMzUzNzIsIGwgOiAyMTguNDU5NDUzMjUsIGxwIDogLTAuMzIyNDE0NjQsIG8gOiAtMC4wMDUwODY2NH1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHtcclxuXHRcdG5hbWU6ICdwbHV0bycsXHJcblx0XHR0aXRsZSA6ICdQbHV0bycsXHJcblx0XHRtYXNzIDogMS4zMDVlMjIrMS41MmUyMSxcclxuXHRcdHJhZGl1cyA6IDExNTMsXHJcblx0XHRvcmJpdCA6IHtcclxuXHRcdFx0YmFzZSA6IHthIDogMzkuNDgyMTE2NzUgKiBucy5BVSAsICBlIDogMC4yNDg4MjczMCwgaTogMTcuMTQwMDEyMDYsIGwgOiAyMzguOTI5MDM4MzMsIGxwIDogMjI0LjA2ODkxNjI5LCBvIDogMTEwLjMwMzkzNjg0fSxcclxuXHRcdFx0Y3kgOiB7YSA6IC0wLjAwMDMxNTk2ICogbnMuQVUgLCAgZSA6IDAuMDAwMDUxNzAsIGk6IDAuMDAwMDQ4MTgsIGwgOiAxNDUuMjA3ODA1MTUsIGxwIDogLTAuMDQwNjI5NDIsIG8gOiAtMC4wMTE4MzQ4Mn1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHtcclxuXHRcdG5hbWU6ICdoYWxsZXknLFxyXG5cdFx0dGl0bGUgOiAnSGFsbGV5XFwncyBDb21ldCcsXHJcblx0XHRtYXNzIDogMi4yZTE0LFxyXG5cdFx0cmFkaXVzIDogNTAsXHJcblx0XHRvcmJpdCA6IHtcclxuXHRcdFx0YmFzZSA6IHthIDogMTcuODM0MTQ0MjkgKiBucy5BVSAsICBlIDogMC45NjcxNDI5MDgsIGk6IDE2Mi4yNjI2OTEsIE0gOiAzNjAgKiAoNDM4MzkzNjAwIC8gKDc1LjEgKiBucy5ZRUFSICogbnMuREFZKSksIHcgOiAxMTEuMzMyNDg1LCBvIDogNTguNDIwMDgxfSxcclxuXHRcdFx0ZGF5IDoge2EgOiAwICwgIGUgOiAwLCBpOiAwLCBNIDogKDM2MCAvICg3NS4xICogMzY1LjI1KSApLCB3IDogMCwgbyA6IDB9XHJcblx0XHR9XHJcblx0fSxcclxuXHR7XHJcblx0XHRuYW1lOiAnbW9vbicsXHJcblx0XHR0aXRsZSA6ICdUaGUgTW9vbicsXHJcblx0XHRtYXNzIDogNy4zNDc3ZTIyLFxyXG5cdFx0cmFkaXVzIDogMTczOC4xLFxyXG5cdFx0c2lkZXJhbERheSA6ICgyNy4zMjE1NzgyICogbnMuREFZKSAsXHJcblx0XHR0aWx0IDogMS41NDI0LFxyXG5cdFx0Zm92IDogMSxcclxuXHRcdHJlbGF0aXZlVG8gOiAnZWFydGgnLFxyXG5cdFx0b3JiaXRDYWxjdWxhdG9yIDogTW9vblJlYWxPcmJpdCxcclxuXHRcdG9yYml0OiB7XHJcblx0XHRcdGJhc2UgOiB7XHJcblx0XHRcdFx0YSA6IDM4NDQwMCxcclxuXHRcdFx0XHRlIDogMC4wNTU0LFxyXG5cdFx0XHRcdHcgOiAzMTguMTUsXHJcblx0XHRcdFx0TSA6IDEzNS4yNyxcclxuXHRcdFx0XHRpIDogNS4xNixcclxuXHRcdFx0XHRvIDogMTI1LjA4XHJcblx0XHRcdH0sXHJcblx0XHRcdGRheSA6IHtcclxuXHRcdFx0XHRhIDogMCxcclxuXHRcdFx0XHRlIDogMCxcclxuXHRcdFx0XHRpIDogMCxcclxuXHRcdFx0XHRNIDogMTMuMTc2MzU4LC8vMzYwIC8gMjcuMzIxNTgyLFxyXG5cdFx0XHRcdHcgOiAoMzYwIC8gNS45OTcpIC8gMzY1LjI1LFxyXG5cdFx0XHRcdG8gOiAoMzYwIC8gMTguNjAwKSAvIDM2NS4yNVxyXG5cdFx0XHR9XHRcclxuXHRcdH1cclxuXHR9XHJcbl07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0c2luaCA6IGZ1bmN0aW9uKGEpIHtcclxuXHRcdHJldHVybiAoTWF0aC5leHAoYSkgLSBNYXRoLmV4cCgtYSkpIC8gMjtcclxuXHR9LFxyXG5cclxuXHRjb3NoIDogZnVuY3Rpb24oYSkge1xyXG5cdFx0cmV0dXJuIChNYXRoLnBvdyhNYXRoLkUsIGEpICsgTWF0aC5wb3coTWF0aC5FLCAtYSkpIC8gMjtcclxuXHR9LFxyXG5cclxuXHRzaWduIDogZnVuY3Rpb24oYSkge1xyXG5cdFx0cmV0dXJuIChhID49IDAuMCkgPyAxIDogLTE7XHJcblx0fVxyXG59OyIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBucyA9IHJlcXVpcmUoJ25zJyk7XHJcblxyXG52YXIgREVHX1RPX1JBRCA9IG5zLkRFR19UT19SQUQ7XHJcbnZhciBSQURfVE9fREVHID0gbnMuUkFEX1RPX0RFRztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odCl7XHJcblxyXG5cdHZhciB0MiA9IHQgKiB0O1xyXG5cdHZhciB0MyA9IHQgKiB0MjtcclxuXHR2YXIgdDQgPSB0ICogdDM7XHJcblx0dmFyIHQ1ID0gdCAqIHQ0O1xyXG5cclxuXHR2YXIgdDJlNCA9IHQyICogMWUtNDtcclxuXHR2YXIgdDNlNiA9IHQzICogMWUtNjtcclxuXHR2YXIgdDRlOCA9IHQ0ICogMWUtODtcclxuXHJcblx0Ly8lIHNlbWltYWpvciBheGlzXHJcblxyXG5cdHZhciBzYSA9IDM0MDAuNCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMjM1LjcwMDQgKyA4OTA1MzQuMjIzMCAqIHQgLSAzMi42MDEgKiB0MmU0IFxyXG5cdCsgMy42NjQgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0LSA2MzUuNiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTAwLjczNzAgKyA0MTMzMzUuMzU1NCAqIHQgLSAxMjIuNTcxICogdDJlNCBcclxuXHQtIDEwLjY4NCAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQtIDIzNS42ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMzQuOTYzNCArIDQ3NzE5OC44Njc2ICogdCArIDg5Ljk3MCAqIHQyZTQgXHJcblx0KyAxNC4zNDggKiB0M2U2IC0gNi43OTcgKiB0NGU4KSkgXHJcblx0KyAyMTguMSAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMjM4LjE3MTMgKyAgODU0NTM1LjE3MjcgKiB0IC0gMzEuMDY1ICogdDJlNCBcclxuXHQrIDMuNjIzICogdDNlNiAgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQrIDE4MS4wICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMC42NjM4ICsgMTM2NzczMy4wOTA3ICogdCArIDU3LjM3MCAqIHQyZTQgXHJcblx0KyAxOC4wMTEgKiB0M2U2IC0gOC41NjYgKiB0NGU4KSkgXHJcblx0LSAzOS45ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMDMuMjA3OSArIDM3NzMzNi4zMDUxICogdCAtIDEyMS4wMzUgKiB0MmU0IFxyXG5cdC0gMTAuNzI0ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdC0gMzguNCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMjMzLjIyOTUgKyA5MjY1MzMuMjczMyAqIHQgLSAzNC4xMzYgKiB0MmU0IFxyXG5cdCsgMy43MDUgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0KyAzMy44ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzMzYuNDM3NCArIDEzMDM4NjkuNTc4NCAqIHQgLSAxNTUuMTcxICogdDJlNCBcclxuXHQtIDcuMDIwICogdDNlNiArIDMuMjU5ICogdDRlOCkpIFxyXG5cdCsgMjguOCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTExLjQwMDggKyAxNzgxMDY4LjQ0NjEgKiB0IC0gNjUuMjAxICogdDJlNCBcclxuXHQrIDcuMzI4ICogdDNlNiAtIDMuNTM4ICogdDRlOCkpIFxyXG5cdCsgMTIuNiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTMuMTM0NyArIDEzMzE3MzQuMDQwNCAqIHQgKyA1OC45MDYgKiB0MmU0IFxyXG5cdCsgMTcuOTcxICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdCsgMTEuNCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTg2LjU0NDIgKyA5NjY0MDQuMDM1MSAqIHQgLSA2OC4wNTggKiB0MmU0IFxyXG5cdC0gMC41NjcgKiB0M2U2ICsgMC4yMzIgKiB0NGU4KSkgXHJcblx0LSAxMS4xICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMjIuNTY1NyAtIDQ0MTE5OS44MTczICogdCAtIDkxLjUwNiAqIHQyZTQgXHJcblx0LSAxNC4zMDcgKiB0M2U2ICsgNi43OTcgKiB0NGU4KSkgXHJcblx0LSAxMC4yICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNjkuOTI2OCArIDk1NDM5Ny43MzUzICogdCArIDE3OS45NDEgKiB0MmU0IFxyXG5cdCsgMjguNjk1ICogdDNlNiAtIDEzLjU5NCAqIHQ0ZTgpKSBcclxuXHQrIDkuNyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTQ1LjYyNzIgKyAxODQ0OTMxLjk1ODMgKiB0ICsgMTQ3LjM0MCAqIHQyZTQgXHJcblx0KyAzMi4zNTkgKiB0M2U2IC0gMTUuMzYzICogdDRlOCkpIFxyXG5cdCsgOS42ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNDAuNjQyMiArIDgxODUzNi4xMjI1ICogdCAtIDI5LjUyOSAqIHQyZTQgXHJcblx0KyAzLjU4MiAqIHQzZTYgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQrIDguMCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMjk3Ljg1MDIgKyA0NDUyNjcuMTExNSAqIHQgLSAxNi4zMDAgKiB0MmU0IFxyXG5cdCsgMS44MzIgKiB0M2U2IC0gMC44ODQgKiB0NGU4KSkgXHJcblx0LSA2LjIgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEzMi40OTI1ICsgNTEzMTk3LjkxNzkgKiB0ICsgODguNDM0ICogdDJlNCBcclxuXHQrIDE0LjM4OCAqIHQzZTYgLSA2Ljc5NyAqIHQ0ZTgpKSBcclxuXHQrIDYuMCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTczLjU1MDYgKyAxMzM1ODAxLjMzNDYgKiB0IC0gNDguOTAxICogdDJlNCBcclxuXHQrIDUuNDk2ICogdDNlNiAtIDIuNjUzICogdDRlOCkpIFxyXG5cdCsgMy43ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMTMuODcxNyArIDE3NDUwNjkuMzk1OCAqIHQgLSA2My42NjUgKiB0MmU0IFxyXG5cdCsgNy4yODcgKiB0M2U2IC0gMy41MzggKiB0NGU4KSkgXHJcblx0KyAzLjYgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMzOC45MDgzICsgMTI2Nzg3MC41MjgxICogdCAtIDE1My42MzYgKiB0MmU0IFxyXG5cdC0gNy4wNjEgKiB0M2U2ICsgMy4yNTkgKiB0NGU4KSkgXHJcblx0KyAzLjIgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDI0Ni4zNjQyICsgMjI1ODI2Ny4zMTM3ICogdCArIDI0Ljc2OSAqIHQyZTQgXHJcblx0KyAyMS42NzUgKiB0M2U2IC0gMTAuMzM1ICogdDRlOCkpIFxyXG5cdC0gMy4wICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICg4LjE5MjkgKyAxNDAzNzMyLjE0MTAgKiB0ICsgNTUuODM0ICogdDJlNCBcclxuXHQrIDE4LjA1MiAqIHQzZTYgLSA4LjU2NiAqIHQ0ZTgpKSBcclxuXHQrIDIuMyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoOTguMjY2MSArIDQ0OTMzNC40MDU3ICogdCAtIDEyNC4xMDcgKiB0MmU0IFxyXG5cdC0gMTAuNjQzICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdC0gMi4yICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzNTcuNTI5MSArIDM1OTk5LjA1MDMgKiB0IC0gMS41MzYgKiB0MmU0IFxyXG5cdCsgMC4wNDEgKiB0M2U2ICsgMC4wMDAgKiB0NGU4KSkgXHJcblx0LSAyLjAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDM4LjU4NzIgKyA4NTg2MDIuNDY2OSAqIHQgLSAxMzguODcxICogdDJlNCBcclxuXHQtIDguODUyICogdDNlNiArIDQuMTQ0ICogdDRlOCkpIFxyXG5cdC0gMS44ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMDUuNjc4OCArIDM0MTMzNy4yNTQ4ICogdCAtIDExOS40OTkgKiB0MmU0IFxyXG5cdC0gMTAuNzY1ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdC0gMS43ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMDEuNDc0MCArIDgyNjY3MC43MTA4ICogdCAtIDI0NS4xNDIgKiB0MmU0IFxyXG5cdC0gMjEuMzY3ICogdDNlNiArIDEwLjA1NyAqIHQ0ZTgpKSBcclxuXHQrIDEuNiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTg0LjExOTYgKyA0MDEzMjkuMDU1NiAqIHQgKyAxMjUuNDI4ICogdDJlNCBcclxuXHQrIDE4LjU3OSAqIHQzZTYgLSA4Ljc5OCAqIHQ0ZTgpKSBcclxuXHQtIDEuNCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMzA4LjQxOTIgLSA0ODkyMDUuMTY3NCAqIHQgKyAxNTguMDI5ICogdDJlNCBcclxuXHQrIDE0LjkxNSAqIHQzZTYgLSA3LjAyOSAqIHQ0ZTgpKSBcclxuXHQrIDEuMyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMzI1Ljc3MzYgLSA2Mzg2My41MTIyICogdCAtIDIxMi41NDEgKiB0MmU0IFxyXG5cdC0gMjUuMDMxICogdDNlNiArIDExLjgyNiAqIHQ0ZTgpKTtcclxuXHJcblx0dmFyIHNhcHAgPSAtIDAuNTUgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDIzOC4yICsgODU0NTM1LjIgKiB0KSkgXHJcblx0XHQrIDAuMTAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEwMy4yICsgMzc3MzM2LjMgKiB0KSkgXHJcblx0XHQrIDAuMTAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDIzMy4yICsgOTI2NTMzLjMgKiB0KSk7XHJcblxyXG5cdHZhciBzbWEgPSAzODMzOTcuNiArIHNhICsgc2FwcCAqIHQ7XHJcblxyXG5cdC8vJSBvcmJpdGFsIGVjY2VudHJpY2l0eVxyXG5cclxuXHR2YXIgc2UgPSAwLjAxNDIxNyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTAwLjczNzAgKyA0MTMzMzUuMzU1NCAqIHQgLSAxMjIuNTcxICogdDJlNCBcclxuXHQtIDEwLjY4NCAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQrIDAuMDA4NTUxICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzMjUuNzczNiAtIDYzODYzLjUxMjIgKiB0IC0gMjEyLjU0MSAqIHQyZTQgXHJcblx0LSAyNS4wMzEgKiB0M2U2ICsgMTEuODI2ICogdDRlOCkpIFxyXG5cdC0gMC4wMDEzODMgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEzNC45NjM0ICsgNDc3MTk4Ljg2NzYgKiB0ICsgODkuOTcwICogdDJlNCBcclxuXHQrIDE0LjM0OCAqIHQzZTYgLSA2Ljc5NyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAxMzUzICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMC42NjM4ICsgMTM2NzczMy4wOTA3ICogdCArIDU3LjM3MCAqIHQyZTQgXHJcblx0KyAxOC4wMTEgKiB0M2U2IC0gOC41NjYgKiB0NGU4KSkgXHJcblx0LSAwLjAwMTE0NiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoNjYuNTEwNiArIDM0OTQ3MS44NDMyICogdCAtIDMzNS4xMTIgKiB0MmU0IFxyXG5cdC0gMzUuNzE1ICogdDNlNiArIDE2Ljg1NCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwOTE1ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMDEuNDc0MCArIDgyNjY3MC43MTA4ICogdCAtIDI0NS4xNDIgKiB0MmU0IFxyXG5cdC0gMjEuMzY3ICogdDNlNiArIDEwLjA1NyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwODY5ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMDMuMjA3OSArIDM3NzMzNi4zMDUxICogdCAtIDEyMS4wMzUgKiB0MmU0IFxyXG5cdC0gMTAuNzI0ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdC0gMC4wMDA2MjggKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDIzNS43MDA0ICsgODkwNTM0LjIyMzAgKiB0IC0gMzIuNjAxICogdDJlNCBcclxuXHQrIDMuNjY0ICogdDNlNiAgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMzkzICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyOTEuNTQ3MiAtIDEyNzcyNy4wMjQ1ICogdCAtIDQyNS4wODIgKiB0MmU0IFxyXG5cdC0gNTAuMDYyICogdDNlNiArIDIzLjY1MSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMjg0ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzMjguMjQ0NSAtIDk5ODYyLjU2MjUgKiB0IC0gMjExLjAwNSAqIHQyZTQgXHJcblx0LSAyNS4wNzIgKiB0M2U2ICsgMTEuODI2ICogdDRlOCkpIFxyXG5cdC0gMC4wMDAyNzggKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE2Mi44ODY4IC0gMzE5MzEuNzU2MSAqIHQgLSAxMDYuMjcxICogdDJlNCBcclxuXHQtIDEyLjUxNiAqIHQzZTYgKyA1LjkxMyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMjQwICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNjkuOTI2OCArIDk1NDM5Ny43MzUzICogdCArIDE3OS45NDEgKiB0MmU0IFxyXG5cdCsgMjguNjk1ICogdDNlNiAtIDEzLjU5NCAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMjMwICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMTEuNDAwOCArIDE3ODEwNjguNDQ2MSAqIHQgLSA2NS4yMDEgKiB0MmU0IFxyXG5cdCsgNy4zMjggKiB0M2U2ICAtIDMuNTM4ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAyMjkgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE2Ny4yNDc2ICsgNzYyODA3LjE5ODYgKiB0IC0gNDU3LjY4MyAqIHQyZTQgXHJcblx0LSA0Ni4zOTggKiB0M2U2ICsgMjEuODgyICogdDRlOCkpIFxyXG5cdC0gMC4wMDAyMDIgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKCA4My4zODI2IC0gMTIwMDYuMjk5OCAqIHQgKyAyNDcuOTk5ICogdDJlNCBcclxuXHQrIDI5LjI2MiAqIHQzZTYgLSAxMy44MjYgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDE5MCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTkwLjgxMDIgLSA1NDEwNjIuMzc5OSAqIHQgLSAzMDIuNTExICogdDJlNCBcclxuXHQtIDM5LjM3OSAqIHQzZTYgKyAxOC42MjMgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDE3NyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMzU3LjUyOTEgKyAzNTk5OS4wNTAzICogdCAtIDEuNTM2ICogdDJlNCBcclxuXHQrIDAuMDQxICogdDNlNiArIDAuMDAwICogdDRlOCkpIFxyXG5cdCsgMC4wMDAxNTMgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMyLjI4NDIgKyAyODU2MDguMzMwOSAqIHQgLSA1NDcuNjUzICogdDJlNCBcclxuXHQtIDYwLjc0NiAqIHQzZTYgKyAyOC42NzkgKiB0NGU4KSkgXHJcblx0LSAwLjAwMDEzNyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoNDQuODkwMiArIDE0MzE1OTYuNjAyOSAqIHQgKyAyNjkuOTExICogdDJlNCBcclxuXHQrIDQzLjA0MyAqIHQzZTYgLSAyMC4zOTIgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDEyMiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTQ1LjYyNzIgKyAxODQ0OTMxLjk1ODMgKiB0ICsgMTQ3LjM0MCAqIHQyZTQgXHJcblx0KyAzMi4zNTkgKiB0M2U2IC0gMTUuMzYzICogdDRlOCkpIFxyXG5cdCsgMC4wMDAxMTYgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMwMi4yMTEwICsgMTI0MDAwNi4wNjYyICogdCAtIDM2Ny43MTMgKiB0MmU0IFxyXG5cdC0gMzIuMDUxICogdDNlNiArIDE1LjA4NSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMTExICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMDMuOTQ0OSArIDc5MDY3MS42NjA1ICogdCAtIDI0My42MDYgKiB0MmU0IFxyXG5cdC0gMjEuNDA4ICogdDNlNiArIDEwLjA1NyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMTA4ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICg2OC45ODE1ICsgMzEzNDcyLjc5MjkgKiB0IC0gMzMzLjU3NiAqIHQyZTQgXHJcblx0LSAzNS43NTYgKiB0M2U2ICsgMTYuODU0ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwOTYgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMzNi40Mzc0ICsgMTMwMzg2OS41Nzg0ICogdCAtIDE1NS4xNzEgKiB0MmU0IFxyXG5cdC0gNy4wMjAgKiB0M2U2ICsgMy4yNTkgKiB0NGU4KSkgXHJcblx0LSAwLjAwMDA5MCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoOTguMjY2MSArIDQ0OTMzNC40MDU3ICogdCAtIDEyNC4xMDcgKiB0MmU0IFxyXG5cdC0gMTAuNjQzICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwOTAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEzLjEzNDcgKyAxMzMxNzM0LjA0MDQgKiB0ICsgNTguOTA2ICogdDJlNCBcclxuXHQrIDE3Ljk3MSAqIHQzZTYgLSA4LjU2NiAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDU2ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICg1NS44NDY4IC0gMTAxODI2MS4yNDc1ICogdCAtIDM5Mi40ODIgKiB0MmU0IFxyXG5cdC0gNTMuNzI2ICogdDNlNiArIDI1LjQyMCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDU2ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMzguMTcxMyArIDg1NDUzNS4xNzI3ICogdCAtIDMxLjA2NSAqIHQyZTQgXHJcblx0KyAzLjYyMyAqIHQzZTYgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDUyICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzMDguNDE5MiAtIDQ4OTIwNS4xNjc0ICogdCArIDE1OC4wMjkgKiB0MmU0IFxyXG5cdCsgMTQuOTE1ICogdDNlNiAtIDcuMDI5ICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwNTAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEzMy4wMjEyICsgNjk4OTQzLjY4NjMgKiB0IC0gNjcwLjIyNCAqIHQyZTQgXHJcblx0LSA3MS40MjkgKiB0M2U2ICsgMzMuNzA4ICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwNDkgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDI2Ny45ODQ2ICsgMTE3NjE0Mi41NTQwICogdCAtIDU4MC4yNTQgKiB0MmU0IFxyXG5cdC0gNTcuMDgyICogdDNlNiArIDI2LjkxMSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDQ5ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxODQuMTE5NiArIDQwMTMyOS4wNTU2ICogdCArIDEyNS40MjggKiB0MmU0IFxyXG5cdCsgMTguNTc5ICogdDNlNiAtIDguNzk4ICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwNDUgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDQ5LjE1NjIgLSA3NTg2OS44MTIwICogdCArIDM1LjQ1OCAqIHQyZTQgXHJcblx0KyA0LjIzMSAqIHQzZTYgLSAyLjAwMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDQ0ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNTcuMzIwOCAtIDE5MTU5MC41MzY3ICogdCAtIDYzNy42MjMgKiB0MmU0IFxyXG5cdC0gNzUuMDkzICogdDNlNiArIDM1LjQ3NyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDQyICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMDUuNjc4OCArIDM0MTMzNy4yNTQ4ICogdCAtIDExOS40OTkgKiB0MmU0IFxyXG5cdC0gMTAuNzY1ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwNDIgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE2MC40MTU5ICsgNDA2Ny4yOTQyICogdCAtIDEwNy44MDYgKiB0MmU0IFxyXG5cdC0gMTIuNDc1ICogdDNlNiArIDUuOTEzICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwNDAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDI0Ni4zNjQyICsgMjI1ODI2Ny4zMTM3ICogdCArIDI0Ljc2OSAqIHQyZTQgXHJcblx0KyAyMS42NzUgKiB0M2U2IC0gMTAuMzM1ICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwNDAgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE1Ni41ODM4IC0gNjA0OTI1Ljg5MjEgKiB0IC0gNTE1LjA1MyAqIHQyZTQgXHJcblx0LSA2NC40MTAgKiB0M2U2ICsgMzAuNDQ4ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwMzYgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE2OS43MTg1ICsgNzI2ODA4LjE0ODMgKiB0IC0gNDU2LjE0NyAqIHQyZTQgXHJcblx0LSA0Ni40MzkgKiB0M2U2ICsgMjEuODgyICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwMjkgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDExMy44NzE3ICsgMTc0NTA2OS4zOTU4ICogdCAtIDYzLjY2NSAqIHQyZTQgXHJcblx0KyA3LjI4NyAqIHQzZTYgLSAzLjUzOCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDI5ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyOTcuODUwMiArIDQ0NTI2Ny4xMTE1ICogdCAtIDE2LjMwMCAqIHQyZTQgXHJcblx0KyAxLjgzMiAqIHQzZTYgLSAwLjg4NCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDI4ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyOTQuMDE4MSAtIDE2MzcyNi4wNzQ3ICogdCAtIDQyMy41NDYgKiB0MmU0IFxyXG5cdC0gNTAuMTAzICogdDNlNiArIDIzLjY1MSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDI3ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNjMuNjIzOCArIDM4MTQwMy41OTkzICogdCAtIDIyOC44NDEgKiB0MmU0IFxyXG5cdC0gMjMuMTk5ICogdDNlNiArIDEwLjk0MSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDI2ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgzNTguMDU3OCArIDIyMTc0NC44MTg3ICogdCAtIDc2MC4xOTQgKiB0MmU0IFxyXG5cdC0gODUuNzc3ICogdDNlNiArIDQwLjUwNSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDI2ICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICg4LjE5MjkgKyAxNDAzNzMyLjE0MTAgKiB0ICsgNTUuODM0ICogdDJlNCBcclxuXHQrIDE4LjA1MiAqIHQzZTYgLSA4LjU2NiAqIHQ0ZTgpKTtcclxuXHJcblx0dmFyIHNlZHAgPSAtMC4wMDIyICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMDMuMiArIDM3NzMzNi4zICogdCkpO1xyXG5cclxuXHR2YXIgZWNjID0gMC4wNTU1NDQgKyBzZSArIDFlLTMgKiB0ICogc2VkcDtcclxuXHJcblx0Ly8lIHNpbmUgb2YgaGFsZiB0aGUgaW5jbGluYXRpb25cclxuXHJcbnZhciBzZyA9IDAuMDAxMTc3NiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoNDkuMTU2MiAtIDc1ODY5LjgxMjAgKiB0ICsgMzUuNDU4ICogdDJlNCBcclxuXHQrIDQuMjMxICogdDNlNiAtIDIuMDAxICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwOTcxICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyMzUuNzAwNCArIDg5MDUzNC4yMjMwICogdCAtIDMyLjYwMSAqIHQyZTQgXHJcblx0KyAzLjY2NCAqIHQzZTYgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDkwOCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTg2LjU0NDIgKyA5NjY0MDQuMDM1MSAqIHQgLSA2OC4wNTggKiB0MmU0IFxyXG5cdC0gMC41NjcgKiB0M2U2ICsgMC4yMzIgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDA2MjMgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDgzLjM4MjYgLSAxMjAwNi4yOTk4ICogdCArIDI0Ny45OTkgKiB0MmU0IFxyXG5cdCsgMjkuMjYyICogdDNlNiAtIDEzLjgyNiAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDQ4MyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoNTEuNjI3MSAtIDExMTg2OC44NjIzICogdCArIDM2Ljk5NCAqIHQyZTQgXHJcblx0KyA0LjE5MCAqIHQzZTYgLSAyLjAwMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDM0OCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTAwLjczNzAgKyA0MTMzMzUuMzU1NCAqIHQgLSAxMjIuNTcxICogdDJlNCBcclxuXHQtIDEwLjY4NCAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDMxNiAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMzA4LjQxOTIgLSA0ODkyMDUuMTY3NCAqIHQgKyAxNTguMDI5ICogdDJlNCBcclxuXHQrIDE0LjkxNSAqIHQzZTYgLSA3LjAyOSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMDI1MyAqIE1hdGguY29zKERFR19UT19SQUQgKiAoNDYuNjg1MyAtIDM5ODcwLjc2MTcgKiB0ICsgMzMuOTIyICogdDJlNCBcclxuXHQrIDQuMjcyICogdDNlNiAtIDIuMDAxICogdDRlOCkpIFxyXG5cdC0gMC4wMDAwMTQxICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgyNzQuMTkyOCAtIDU1MzA2OC42Nzk3ICogdCAtIDU0LjUxMyAqIHQyZTQgXHJcblx0LSAxMC4xMTYgKiB0M2U2ICsgNC43OTcgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDAxMjcgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMyNS43NzM2IC0gNjM4NjMuNTEyMiAqIHQgLSAyMTIuNTQxICogdDJlNCBcclxuXHQtIDI1LjAzMSAqIHQzZTYgKyAxMS44MjYgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDAxMTcgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE4NC4xMTk2ICsgNDAxMzI5LjA1NTYgKiB0ICsgMTI1LjQyOCAqIHQyZTQgXHJcblx0KyAxOC41NzkgKiB0M2U2IC0gOC43OTggKiB0NGU4KSkgXHJcblx0LSAwLjAwMDAwNzggKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDk4LjMxMjQgLSAxNTE3MzkuNjI0MCAqIHQgKyA3MC45MTYgKiB0MmU0IFxyXG5cdCsgOC40NjIgKiB0M2U2IC0gNC4wMDEgKiB0NGU4KSkgXHJcblx0LSAwLjAwMDAwNjMgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDIzOC4xNzEzICsgODU0NTM1LjE3MjcgKiB0IC0gMzEuMDY1ICogdDJlNCBcclxuXHQrIDMuNjIzICogdDNlNiAtIDEuNzY5ICogdDRlOCkpIFxyXG5cdCsgMC4wMDAwMDYzICogTWF0aC5jb3MoREVHX1RPX1JBRCAqICgxMzQuOTYzNCArIDQ3NzE5OC44Njc2ICogdCArIDg5Ljk3MCAqIHQyZTQgXHJcblx0KyAxNC4zNDggKiB0M2U2IC0gNi43OTcgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDAwMzYgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDMyMS41MDc2ICsgMTQ0MzYwMi45MDI3ICogdCArIDIxLjkxMiAqIHQyZTQgXHJcblx0KyAxMy43ODAgKiB0M2U2IC0gNi41NjYgKiB0NGU4KSkgXHJcblx0LSAwLjAwMDAwMzUgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEwLjY2MzggKyAxMzY3NzMzLjA5MDcgKiB0ICsgNTcuMzcwICogdDJlNCBcclxuXHQrIDE4LjAxMSAqIHQzZTYgLSA4LjU2NiAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMDAyNCAqIE1hdGguY29zKERFR19UT19SQUQgKiAoMTQ5Ljg5MzIgKyAzMzc0NjUuNTQzNCAqIHQgLSA4Ny4xMTMgKiB0MmU0IFxyXG5cdC0gNi40NTMgKiB0M2U2ICsgMy4wMjggKiB0NGU4KSkgXHJcblx0KyAwLjAwMDAwMjQgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDE3MC45ODQ5IC0gOTMwNDA0Ljk4NDggKiB0ICsgNjYuNTIzICogdDJlNCBcclxuXHQrIDAuNjA4ICogdDNlNiAtIDAuMjMyICogdDRlOCkpO1xyXG5cclxuXHR2YXIgc2dwID0gLSAwLjAyMDMgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDEyNS4wIC0gMTkzNC4xICogdCkpIFxyXG5cdFx0KyAwLjAwMzQgKiBNYXRoLmNvcyhERUdfVE9fUkFEICogKDIyMC4yIC0gMTkzNS41ICogdCkpO1xyXG5cclxuXHR2YXIgZ2FtbWEgPSAwLjA0NDk4NTggKyBzZyArIDFlLTMgKiBzZ3A7XHJcblxyXG5cdC8vJSBsb25naXR1ZGUgb2YgcGVyaWdlZVxyXG5cclxuXHR2YXIgc3AgPSAtIDE1LjQ0OCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTAwLjczNzAgKyA0MTMzMzUuMzU1NCAqIHQgLSAxMjIuNTcxICogdDJlNCBcclxuXHQtIDEwLjY4NCAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKVxyXG5cdC0gOS42NDIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDMyNS43NzM2IC0gNjM4NjMuNTEyMiAqIHQgLSAyMTIuNTQxICogdDJlNCBcclxuXHQtIDI1LjAzMSAqIHQzZTYgKyAxMS44MjYgKiB0NGU4KSkgXHJcblx0LSAyLjcyMSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTM0Ljk2MzQgKyA0NzcxOTguODY3NiAqIHQgKyA4OS45NzAgKiB0MmU0IFxyXG5cdCsgMTQuMzQ4ICogdDNlNiAtIDYuNzk3ICogdDRlOCkpIFxyXG5cdCsgMi42MDcgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDY2LjUxMDYgKyAzNDk0NzEuODQzMiAqIHQgLSAzMzUuMTEyICogdDJlNCBcclxuXHQtIDM1LjcxNSAqIHQzZTYgKyAxNi44NTQgKiB0NGU4KSkgXHJcblx0KyAyLjA4NSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjAxLjQ3NDAgKyA4MjY2NzAuNzEwOCAqIHQgLSAyNDUuMTQyICogdDJlNCBcclxuXHQtIDIxLjM2NyAqIHQzZTYgKyAxMC4wNTcgKiB0NGU4KSkgXHJcblx0KyAxLjQ3NyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTAuNjYzOCArIDEzNjc3MzMuMDkwNyAqIHQgKyA1Ny4zNzAgKiB0MmU0IFxyXG5cdCsgMTguMDExICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdCsgMC45NjggKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI5MS41NDcyIC0gMTI3NzI3LjAyNDUgKiB0IC0gNDI1LjA4MiAqIHQyZTQgXHJcblx0LSA1MC4wNjIgKiB0M2U2ICsgMjMuNjUxICogdDRlOCkpIFxyXG5cdC0gMC45NDkgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDEwMy4yMDc5ICsgMzc3MzM2LjMwNTEgKiB0IC0gMTIxLjAzNSAqIHQyZTQgXHJcblx0LSAxMC43MjQgKiB0M2U2ICsgNS4wMjggKiB0NGU4KSkgXHJcblx0LSAwLjcwMyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTY3LjI0NzYgKyA3NjI4MDcuMTk4NiAqIHQgLSA0NTcuNjgzICogdDJlNCBcclxuXHQtIDQ2LjM5OCAqIHQzZTYgKyAyMS44ODIgKiB0NGU4KSkgXHJcblx0LSAwLjY2MCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjM1LjcwMDQgKyA4OTA1MzQuMjIzMCAqIHQgLSAzMi42MDEgKiB0MmU0IFxyXG5cdCsgMy42NjQgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0LSAwLjU3NyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTkwLjgxMDIgLSA1NDEwNjIuMzc5OSAqIHQgLSAzMDIuNTExICogdDJlNCBcclxuXHQtIDM5LjM3OSAqIHQzZTYgKyAxOC42MjMgKiB0NGU4KSkgXHJcblx0LSAwLjUyNCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjY5LjkyNjggKyA5NTQzOTcuNzM1MyAqIHQgKyAxNzkuOTQxICogdDJlNCBcclxuXHQrIDI4LjY5NSAqIHQzZTYgLSAxMy41OTQgKiB0NGU4KSkgXHJcblx0LSAwLjQ4MiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzIuMjg0MiArIDI4NTYwOC4zMzA5ICogdCAtIDU0Ny42NTMgKiB0MmU0IFxyXG5cdC0gNjAuNzQ2ICogdDNlNiArIDI4LjY3OSAqIHQ0ZTgpKSBcclxuXHQrIDAuNDUyICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzNTcuNTI5MSArIDM1OTk5LjA1MDMgKiB0IC0gMS41MzYgKiB0MmU0IFxyXG5cdCsgMC4wNDEgKiB0M2U2ICsgMC4wMDAgKiB0NGU4KSkgXHJcblx0LSAwLjM4MSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzAyLjIxMTAgKyAxMjQwMDA2LjA2NjIgKiB0IC0gMzY3LjcxMyAqIHQyZTQgXHJcblx0LSAzMi4wNTEgKiB0M2U2ICsgMTUuMDg1ICogdDRlOCkpIFxyXG5cdC0gMC4zNDIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDMyOC4yNDQ1IC0gOTk4NjIuNTYyNSAqIHQgLSAyMTEuMDA1ICogdDJlNCBcclxuXHQtIDI1LjA3MiAqIHQzZTYgKyAxMS44MjYgKiB0NGU4KSkgXHJcblx0LSAwLjMxMiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoNDQuODkwMiArIDE0MzE1OTYuNjAyOSAqIHQgKyAyNjkuOTExICogdDJlNCBcclxuXHQrIDQzLjA0MyAqIHQzZTYgLSAyMC4zOTIgKiB0NGU4KSkgXHJcblx0KyAwLjI4MiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTYyLjg4NjggLSAzMTkzMS43NTYxICogdCAtIDEwNi4yNzEgKiB0MmU0IFxyXG5cdC0gMTIuNTE2ICogdDNlNiArIDUuOTEzICogdDRlOCkpIFxyXG5cdCsgMC4yNTUgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDIwMy45NDQ5ICsgNzkwNjcxLjY2MDUgKiB0IC0gMjQzLjYwNiAqIHQyZTQgXHJcblx0LSAyMS40MDggKiB0M2U2ICsgMTAuMDU3ICogdDRlOCkpIFxyXG5cdCsgMC4yNTIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDY4Ljk4MTUgKyAzMTM0NzIuNzkyOSAqIHQgLSAzMzMuNTc2ICogdDJlNCBcclxuXHQtIDM1Ljc1NiAqIHQzZTYgKyAxNi44NTQgKiB0NGU4KSkgXHJcblx0LSAwLjIxMSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoODMuMzgyNiAtIDEyMDA2LjI5OTggKiB0ICsgMjQ3Ljk5OSAqIHQyZTQgXHJcblx0KyAyOS4yNjIgKiB0M2U2IC0gMTMuODI2ICogdDRlOCkpIFxyXG5cdCsgMC4xOTMgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI2Ny45ODQ2ICsgMTE3NjE0Mi41NTQwICogdCAtIDU4MC4yNTQgKiB0MmU0IFxyXG5cdC0gNTcuMDgyICogdDNlNiArIDI2LjkxMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMTkxICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMzMuMDIxMiArIDY5ODk0My42ODYzICogdCAtIDY3MC4yMjQgKiB0MmU0IFxyXG5cdC0gNzEuNDI5ICogdDNlNiArIDMzLjcwOCAqIHQ0ZTgpKSBcclxuXHQtIDAuMTg0ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg1NS44NDY4IC0gMTAxODI2MS4yNDc1ICogdCAtIDM5Mi40ODIgKiB0MmU0IFxyXG5cdC0gNTMuNzI2ICogdDNlNiArIDI1LjQyMCAqIHQ0ZTgpKSBcclxuXHQrIDAuMTgyICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxNDUuNjI3MiArIDE4NDQ5MzEuOTU4MyAqIHQgKyAxNDcuMzQwICogdDJlNCBcclxuXHQrIDMyLjM1OSAqIHQzZTYgLSAxNS4zNjMgKiB0NGU4KSkgXHJcblx0LSAwLjE1OCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjU3LjMyMDggLSAxOTE1OTAuNTM2NyAqIHQgLSA2MzcuNjIzICogdDJlNCBcclxuXHQtIDc1LjA5MyAqIHQzZTYgKyAzNS40NzcgKiB0NGU4KSkgXHJcblx0KyAwLjE0OCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTU2LjU4MzggLSA2MDQ5MjUuODkyMSAqIHQgLSA1MTUuMDUzICogdDJlNCBcclxuXHQtIDY0LjQxMCAqIHQzZTYgKyAzMC40NDggKiB0NGU4KSkgXHJcblx0LSAwLjExMSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTY5LjcxODUgKyA3MjY4MDguMTQ4MyAqIHQgLSA0NTYuMTQ3ICogdDJlNCBcclxuXHQtIDQ2LjQzOSAqIHQzZTYgKyAyMS44ODIgKiB0NGU4KSkgXHJcblx0KyAwLjEwMSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTMuMTM0NyArIDEzMzE3MzQuMDQwNCAqIHQgKyA1OC45MDYgKiB0MmU0IFxyXG5cdCsgMTcuOTcxICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdCsgMC4xMDAgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDM1OC4wNTc4ICsgMjIxNzQ0LjgxODcgKiB0IC0gNzYwLjE5NCAqIHQyZTQgXHJcblx0LSA4NS43NzcgKiB0M2U2ICsgNDAuNTA1ICogdDRlOCkpIFxyXG5cdCsgMC4wODcgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDk4LjI2NjEgKyA0NDkzMzQuNDA1NyAqIHQgLSAxMjQuMTA3ICogdDJlNCBcclxuXHQtIDEwLjY0MyAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQrIDAuMDgwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg0Mi45NDgwICsgMTY1MzM0MS40MjE2ICogdCAtIDQ5MC4yODMgKiB0MmU0IFxyXG5cdC0gNDIuNzM0ICogdDNlNiArIDIwLjExMyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDgwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMjIuNTY1NyAtIDQ0MTE5OS44MTczICogdCAtIDkxLjUwNiAqIHQyZTQgXHJcblx0LSAxNC4zMDcgKiB0M2U2ICsgNi43OTcgKiB0NGU4KSkgXHJcblx0KyAwLjA3NyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjk0LjAxODEgLSAxNjM3MjYuMDc0NyAqIHQgLSA0MjMuNTQ2ICogdDJlNCBcclxuXHQtIDUwLjEwMyAqIHQzZTYgKyAyMy42NTEgKiB0NGU4KSkgXHJcblx0LSAwLjA3MyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjgwLjg4MzQgLSAxNDk1NDYwLjExNTEgKiB0IC0gNDgyLjQ1MiAqIHQyZTQgXHJcblx0LSA2OC4wNzQgKiB0M2U2ICsgMzIuMjE3ICogdDRlOCkpIFxyXG5cdC0gMC4wNzEgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDMwNC42ODE5ICsgMTIwNDAwNy4wMTU5ICogdCAtIDM2Ni4xNzcgKiB0MmU0IFxyXG5cdC0gMzIuMDkyICogdDNlNiArIDE1LjA4NSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDY5ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMzMuNzU4MiArIDExMTIyNzkuMDQxNyAqIHQgLSA3OTIuNzk1ICogdDJlNCBcclxuXHQtIDgyLjExMyAqIHQzZTYgKyAzOC43MzYgKiB0NGU4KSkgXHJcblx0LSAwLjA2NyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzQuNzU1MSArIDI0OTYwOS4yODA3ICogdCAtIDU0Ni4xMTcgKiB0MmU0IFxyXG5cdC0gNjAuNzg3ICogdDNlNiArIDI4LjY3OSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDY3ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyNjMuNjIzOCArIDM4MTQwMy41OTkzICogdCAtIDIyOC44NDEgKiB0MmU0IFxyXG5cdC0gMjMuMTk5ICogdDNlNiArIDEwLjk0MSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDU1ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMS42MjAzIC0gMTA4MjEyNC43NTk3ICogdCAtIDYwNS4wMjMgKiB0MmU0IFxyXG5cdC0gNzguNzU3ICogdDNlNiArIDM3LjI0NiAqIHQ0ZTgpKSBcclxuXHQrIDAuMDU1ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzMDguNDE5MiAtIDQ4OTIwNS4xNjc0ICogdCArIDE1OC4wMjkgKiB0MmU0IFxyXG5cdCsgMTQuOTE1ICogdDNlNiAtNy4wMjkgKiB0NGU4KSkgXHJcblx0LSAwLjA1NCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoOC43MjE2ICsgMTU4OTQ3Ny45MDk0ICogdCAtIDcwMi44MjQgKiB0MmU0IFxyXG5cdC0gNjcuNzY2ICogdDNlNiArIDMxLjkzOSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDUyICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxNzkuODUzNiArIDE5MDg3OTUuNDcwNSAqIHQgKyAzNTkuODgxICogdDJlNCBcclxuXHQrIDU3LjM5MCAqIHQzZTYgLSAyNy4xODkgKiB0NGU4KSkgXHJcblx0LSAwLjA1MCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoOTguNzk0OCArIDYzNTA4MC4xNzQxICogdCAtIDg4Mi43NjUgKiB0MmU0IFxyXG5cdC0gOTYuNDYxICogdDNlNiArIDQ1LjUzMyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDQ5ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMjguNjYwNCAtIDk1Nzk1LjI2ODMgKiB0IC0gMzE4LjgxMiAqIHQyZTQgXHJcblx0LSAzNy41NDcgKiB0M2U2ICsgMTcuNzM4ICogdDRlOCkpIFxyXG5cdC0gMC4wNDcgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE3LjM1NDQgKyA0MjUzNDEuNjU1MiAqIHQgLSAzNzAuNTcwICogdDJlNCBcclxuXHQtIDM5Ljk0NiAqIHQzZTYgKyAxOC44NTQgKiB0NGU4KSkgXHJcblx0LSAwLjA0NCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTYwLjQxNTkgKyA0MDY3LjI5NDIgKiB0IC0gMTA3LjgwNiAqIHQyZTQgXHJcblx0LSAxMi40NzUgKiB0M2U2ICsgNS45MTMgKiB0NGU4KSkgXHJcblx0LSAwLjA0MyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjM4LjE3MTMgKyA4NTQ1MzUuMTcyNyAqIHQgLSAzMS4wNjUgKiB0MmU0IFxyXG5cdCsgMy42MjMgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0KyAwLjA0MiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjcwLjQ1NTUgKyAxMTQwMTQzLjUwMzcgKiB0IC0gNTc4LjcxOCAqIHQyZTQgXHJcblx0LSA1Ny4xMjMgKiB0M2U2ICsgMjYuOTExICogdDRlOCkpIFxyXG5cdC0gMC4wNDIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDEzMi40OTI1ICsgNTEzMTk3LjkxNzkgKiB0ICsgODguNDM0ICogdDJlNCBcclxuXHQrIDE0LjM4OCAqIHQzZTYgLSA2Ljc5NyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDQxICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMjIuMzU3MyAtIDY2ODc4OS40MDQzICogdCAtIDcyNy41OTQgKiB0MmU0IFxyXG5cdC0gODkuNDQxICogdDNlNiArIDQyLjI3NCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDQwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMDUuNjc4OCArIDM0MTMzNy4yNTQ4ICogdCAtIDExOS40OTkgKiB0MmU0IFxyXG5cdC0gMTAuNzY1ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdCsgMC4wMzggKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDEzNS40OTIxICsgNjYyOTQ0LjYzNjEgKiB0IC0gNjY4LjY4OCAqIHQyZTQgXHJcblx0LSA3MS40NzAgKiB0M2U2ICsgMzMuNzA4ICogdDRlOCkpIFxyXG5cdC0gMC4wMzcgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI0Mi4zOTEwIC0gNTE4NTcuMjEyNCAqIHQgLSA0NjAuNTQwICogdDJlNCBcclxuXHQtIDU0LjI5MyAqIHQzZTYgKyAyNS42NTIgKiB0NGU4KSkgXHJcblx0KyAwLjAzNiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzM2LjQzNzQgKyAgMTMwMzg2OS41Nzg0ICogdCAtIDE1NS4xNzEgKiB0MmU0IFxyXG5cdC0gNy4wMjAgKiB0M2U2ICsgMy4yNTkgKiB0NGU4KSkgXHJcblx0KyAwLjAzNSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjIzLjA5NDMgLSAyNTU0NTQuMDQ4OSAqIHQgLSA4NTAuMTY0ICogdDJlNCBcclxuXHQtIDEwMC4xMjQgKiB0M2U2ICsgNDcuMzAyICogdDRlOCkpIFxyXG5cdC0gMC4wMzQgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE5My4yODExIC0gNTc3MDYxLjQzMDIgKiB0IC0gMzAwLjk3NiAqIHQyZTQgXHJcblx0LSAzOS40MTkgKiB0M2U2ICsgMTguNjIzICogdDRlOCkpIFxyXG5cdCsgMC4wMzEgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDg3LjYwMjMgLSA5MTgzOTguNjg1MCAqIHQgLSAxODEuNDc2ICogdDJlNCBcclxuXHQtIDI4LjY1NCAqIHQzZTYgKyAxMy41OTQgKiB0NGU4KSk7XHJcblxyXG5cdHZhciBzcHAgPSAyLjQgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDEwMy4yICsgMzc3MzM2LjMgKiB0KSk7XHJcblxyXG5cdHZhciBscCA9IDgzLjM1MyArIDQwNjkuMDEzNyAqIHQgLSAxMDMuMjM4ICogdDJlNCBcclxuXHQtIDEyLjQ5MiAqIHQzZTYgKyA1LjI2MyAqIHQ0ZTggKyBzcCArIDFlLTMgKiB0ICogc3BwO1xyXG5cclxuXHQvLyUgbG9uZ2l0dWRlIG9mIHRoZSBhc2NlbmRpbmcgbm9kZVxyXG5cclxuXHR2YXIgc3IgPSAtIDEuNDk3OSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoNDkuMTU2MiAtIDc1ODY5LjgxMjAgKiB0ICsgMzUuNDU4ICogdDJlNCBcclxuXHQrIDQuMjMxICogdDNlNiAtIDIuMDAxICogdDRlOCkpIFxyXG5cdC0gMC4xNTAwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzNTcuNTI5MSArIDM1OTk5LjA1MDMgKiB0IC0gMS41MzYgKiB0MmU0IFxyXG5cdCsgMC4wNDEgKiB0M2U2ICsgMC4wMDAgKiB0NGU4KSkgXHJcblx0LSAwLjEyMjYgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDIzNS43MDA0ICsgODkwNTM0LjIyMzAgKiB0IC0gMzIuNjAxICogdDJlNCBcclxuXHQrIDMuNjY0ICogdDNlNiAtIDEuNzY5ICogdDRlOCkpIFxyXG5cdCsgMC4xMTc2ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxODYuNTQ0MiArIDk2NjQwNC4wMzUxICogdCAtIDY4LjA1OCAqIHQyZTQgXHJcblx0LSAwLjU2NyAqIHQzZTYgKyAwLjIzMiAqIHQ0ZTgpKSBcclxuXHQtIDAuMDgwMSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoODMuMzgyNiAtIDEyMDA2LjI5OTggKiB0ICsgMjQ3Ljk5OSAqIHQyZTQgXHJcblx0KyAyOS4yNjIgKiB0M2U2IC0gMTMuODI2ICogdDRlOCkpIFxyXG5cdC0gMC4wNjE2ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg1MS42MjcxIC0gMTExODY4Ljg2MjMgKiB0ICsgMzYuOTk0ICogdDJlNCBcclxuXHQrIDQuMTkwICogdDNlNiAtIDIuMDAxICogdDRlOCkpIFxyXG5cdCsgMC4wNDkwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMDAuNzM3MCArIDQxMzMzNS4zNTU0ICogdCAtIDEyMi41NzEgKiB0MmU0IFxyXG5cdC0gMTAuNjg0ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdCsgMC4wNDA5ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzMDguNDE5MiAtIDQ4OTIwNS4xNjc0ICogdCArIDE1OC4wMjkgKiB0MmU0IFxyXG5cdCsgMTQuOTE1ICogdDNlNiAtIDcuMDI5ICogdDRlOCkpIFxyXG5cdCsgMC4wMzI3ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMzQuOTYzNCArIDQ3NzE5OC44Njc2ICogdCArIDg5Ljk3MCAqIHQyZTQgXHJcblx0KyAxNC4zNDggKiB0M2U2IC0gNi43OTcgKiB0NGU4KSkgXHJcblx0KyAwLjAzMjQgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDQ2LjY4NTMgLSAzOTg3MC43NjE3ICogdCArIDMzLjkyMiAqIHQyZTQgXHJcblx0KyA0LjI3MiAqIHQzZTYgLSAyLjAwMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDE5NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoOTguMzEyNCAtIDE1MTczOS42MjQwICogdCArIDcwLjkxNiAqIHQyZTQgXHJcblx0KyA4LjQ2MiAqIHQzZTYgLSA0LjAwMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDE4MCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjc0LjE5MjggLSA1NTMwNjguNjc5NyAqIHQgLSA1NC41MTMgKiB0MmU0IFxyXG5cdC0gMTAuMTE2ICogdDNlNiArIDQuNzk3ICogdDRlOCkpIFxyXG5cdCsgMC4wMTUwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzMjUuNzczNiAtIDYzODYzLjUxMjIgKiB0IC0gMjEyLjU0MSAqIHQyZTQgXHJcblx0LSAyNS4wMzEgKiB0M2U2ICsgMTEuODI2ICogdDRlOCkpIFxyXG5cdC0gMC4wMTUwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxODQuMTE5NiArIDQwMTMyOS4wNTU2ICogdCArIDEyNS40MjggKiB0MmU0IFxyXG5cdCsgMTguNTc5ICogdDNlNiAtIDguNzk4ICogdDRlOCkpIFxyXG5cdC0gMC4wMDc4ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMzguMTcxMyArIDg1NDUzNS4xNzI3ICogdCAtIDMxLjA2NSAqIHQyZTQgXHJcblx0KyAzLjYyMyAqIHQzZTYgLSAxLjc2OSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDA0NSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTAuNjYzOCArIDEzNjc3MzMuMDkwNyAqIHQgKyA1Ny4zNzAgKiB0MmU0IFxyXG5cdCsgMTguMDExICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdCsgMC4wMDQ0ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzMjEuNTA3NiArIDE0NDM2MDIuOTAyNyAqIHQgKyAyMS45MTIgKiB0MmU0IFxyXG5cdCsgMTMuNzgwICogdDNlNiAtIDYuNTY2ICogdDRlOCkpIFxyXG5cdC0gMC4wMDQyICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxNjIuODg2OCAtIDMxOTMxLjc1NjEgKiB0IC0gMTA2LjI3MSAqIHQyZTQgXHJcblx0LSAxMi41MTYgKiB0M2U2ICsgNS45MTMgKiB0NGU4KSkgXHJcblx0LSAwLjAwMzEgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE3MC45ODQ5IC0gOTMwNDA0Ljk4NDggKiB0ICsgNjYuNTIzICogdDJlNCBcclxuXHQrIDAuNjA4ICogdDNlNiAtIDAuMjMyICogdDRlOCkpIFxyXG5cdCsgMC4wMDMxICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMDMuMjA3OSArIDM3NzMzNi4zMDUxICogdCAtIDEyMS4wMzUgKiB0MmU0IFxyXG5cdC0gMTAuNzI0ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdCsgMC4wMDI5ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMjIuNjEyMCAtIDEwNDIyNzMuODQ3MSAqIHQgKyAxMDMuNTE2ICogdDJlNCBcclxuXHQrIDQuNzk4ICogdDNlNiAtIDIuMjMyICogdDRlOCkpIFxyXG5cdCsgMC4wMDI4ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxODQuMDczMyArIDEwMDI0MDMuMDg1MyAqIHQgLSA2OS41OTQgKiB0MmU0IFxyXG5cdC0gMC41MjYgKiB0M2U2ICsgMC4yMzIgKiB0NGU4KSk7XHJcblxyXG5cdHZhciBzcnAgPSAyNS45ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMjUuMCAtIDE5MzQuMSAqIHQpKSBcclxuXHRcdC0gNC4zICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMjAuMiAtIDE5MzUuNSAqIHQpKTtcclxuXHJcblx0dmFyIHNycHAgPSAwLjM4ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzNTcuNSArIDM1OTk5LjEgKiB0KSk7XHJcblxyXG5cdHZhciByYWFuID0gMTI1LjA0NDYgLSAxOTM0LjEzNjE4ICogdCArIDIwLjc2MiAqIHQyZTQgXHJcblx0XHQrIDIuMTM5ICogdDNlNiAtIDEuNjUwICogdDRlOCArIHNyIFxyXG5cdFx0KyAxZS0zICogKHNycCArIHNycHAgKiB0KTtcclxuXHJcblx0Ly8lIG1lYW4gbG9uZ2l0dWRlXHJcblxyXG5cdHZhciBzbCA9IC0gMC45MjU4MSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjM1LjcwMDQgKyA4OTA1MzQuMjIzMCAqIHQgLSAzMi42MDEgKiB0MmU0IFxyXG5cdCsgMy42NjQgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0KyAwLjMzMjYyICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMDAuNzM3MCArIDQxMzMzNS4zNTU0ICogdCAtIDEyMi41NzEgKiB0MmU0IFxyXG5cdC0gMTAuNjg0ICogdDNlNiArIDUuMDI4ICogdDRlOCkpIFxyXG5cdC0gMC4xODQwMiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzU3LjUyOTEgKyAzNTk5OS4wNTAzICogdCAtIDEuNTM2ICogdDJlNCBcclxuXHQrIDAuMDQxICogdDNlNiArIDAuMDAwICogdDRlOCkpIFxyXG5cdCsgMC4xMTAwNyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTM0Ljk2MzQgKyA0NzcxOTguODY3NiAqIHQgKyA4OS45NzAgKiB0MmU0IFxyXG5cdCsgMTQuMzQ4ICogdDNlNiAtIDYuNzk3ICogdDRlOCkpIFxyXG5cdC0gMC4wNjA1NSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjM4LjE3MTMgKyA4NTQ1MzUuMTcyNyAqIHQgLSAzMS4wNjUgKiB0MmU0IFxyXG5cdCsgMy42MjMgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0KyAwLjA0NzQxICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgzMjUuNzczNiAtIDYzODYzLjUxMjIgKiB0IC0gMjEyLjU0MSAqIHQyZTQgXHJcblx0LSAyNS4wMzEgKiB0M2U2ICsgMTEuODI2ICogdDRlOCkpIFxyXG5cdC0gMC4wMzA4NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTAuNjYzOCArIDEzNjc3MzMuMDkwNyAqIHQgKyA1Ny4zNzAgKiB0MmU0IFxyXG5cdCsgMTguMDExICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdCsgMC4wMjE4NCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTAzLjIwNzkgKyAzNzczMzYuMzA1MSAqIHQgLSAxMjEuMDM1ICogdDJlNCBcclxuXHQtIDEwLjcyNCAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQrIDAuMDE2NDUgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDQ5LjE1NjIgLSA3NTg2OS44MTIwICogdCArIDM1LjQ1OCAqIHQyZTQgXHJcblx0KyA0LjIzMSAqIHQzZTYgLSAyLjAwMSAqIHQ0ZTgpKSBcclxuXHQrIDAuMDEwMjIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDIzMy4yMjk1ICsgOTI2NTMzLjI3MzMgKiB0IC0gMzQuMTM2ICogdDJlNCBcclxuXHQrIDMuNzA1ICogdDNlNiAtIDEuNzY5ICogdDRlOCkpIFxyXG5cdC0gMC4wMDc1NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzM2LjQzNzQgKyAxMzAzODY5LjU3ODQgKiB0IC0gMTU1LjE3MSAqIHQyZTQgXHJcblx0LSA3LjAyMCAqIHQzZTYgKyAzLjI1OSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDA1MzAgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDIyMi41NjU3IC0gNDQxMTk5LjgxNzMgKiB0IC0gOTEuNTA2ICogdDJlNCBcclxuXHQtIDE0LjMwNyAqIHQzZTYgKyA2Ljc5NyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDA0OTYgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE2Mi44ODY4IC0gMzE5MzEuNzU2MSAqIHQgLSAxMDYuMjcxICogdDJlNCBcclxuXHQtIDEyLjUxNiAqIHQzZTYgKyA1LjkxMyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDA0NzIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI5Ny44NTAyICsgNDQ1MjY3LjExMTUgKiB0IC0gMTYuMzAwICogdDJlNCBcclxuXHQrIDEuODMyICogdDNlNiAtIDAuODg0ICogdDRlOCkpIFxyXG5cdC0gMC4wMDI3MSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjQwLjY0MjIgKyA4MTg1MzYuMTIyNSAqIHQgLSAyOS41MjkgKiB0MmU0IFxyXG5cdCsgMy41ODIgKiB0M2U2IC0gMS43NjkgKiB0NGU4KSkgXHJcblx0KyAwLjAwMjY0ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMzIuNDkyNSArIDUxMzE5Ny45MTc5ICogdCArIDg4LjQzNCAqIHQyZTQgXHJcblx0KyAxNC4zODggKiB0M2U2IC0gNi43OTcgKiB0NGU4KSkgXHJcblx0LSAwLjAwMjU0ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxODYuNTQ0MiArIDk2NjQwNC4wMzUxICogdCAtIDY4LjA1OCAqIHQyZTQgXHJcblx0LSAwLjU2NyAqIHQzZTYgKyAwLjIzMiAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAyMzQgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI2OS45MjY4ICsgOTU0Mzk3LjczNTMgKiB0ICsgMTc5Ljk0MSAqIHQyZTQgXHJcblx0KyAyOC42OTUgKiB0M2U2IC0gMTMuNTk0ICogdDRlOCkpIFxyXG5cdC0gMC4wMDIyMCAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTMuMTM0NyArIDEzMzE3MzQuMDQwNCAqIHQgKyA1OC45MDYgKiB0MmU0IFxyXG5cdCsgMTcuOTcxICogdDNlNiAtIDguNTY2ICogdDRlOCkpIFxyXG5cdC0gMC4wMDIwMiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzU1LjA1ODIgKyA3MTk5OC4xMDA2ICogdCAtIDMuMDcyICogdDJlNCBcclxuXHQrIDAuMDgyICogdDNlNiArIDAuMDAwICogdDRlOCkpIFxyXG5cdCsgMC4wMDE2NyAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzI4LjI0NDUgLSA5OTg2Mi41NjI1ICogdCAtIDIxMS4wMDUgKiB0MmU0IFxyXG5cdC0gMjUuMDcyICogdDNlNiArIDExLjgyNiAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAxNDMgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE3My41NTA2ICsgMTMzNTgwMS4zMzQ2ICogdCAtIDQ4LjkwMSAqIHQyZTQgXHJcblx0KyA1LjQ5NiAqIHQzZTYgLSAyLjY1MyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAxMjEgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDk4LjI2NjEgKyA0NDkzMzQuNDA1NyAqIHQgLSAxMjQuMTA3ICogdDJlNCBcclxuXHQtIDEwLjY0MyAqIHQzZTYgKyA1LjAyOCAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAxMTYgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE0NS42MjcyICsgMTg0NDkzMS45NTgzICogdCArIDE0Ny4zNDAgKiB0MmU0IFxyXG5cdCsgMzIuMzU5ICogdDNlNiAtIDE1LjM2MyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAxMDIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDEwNS42Nzg4ICsgMzQxMzM3LjI1NDggKiB0IC0gMTE5LjQ5OSAqIHQyZTQgXHJcblx0LSAxMC43NjUgKiB0M2U2ICsgNS4wMjggKiB0NGU4KSkgXHJcblx0LSAwLjAwMDkwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxODQuMTE5NiArIDQwMTMyOS4wNTU2ICogdCArIDEyNS40MjggKiB0MmU0IFxyXG5cdCsgMTguNTc5ICogdDNlNiAtIDguNzk4ICogdDRlOCkpIFxyXG5cdC0gMC4wMDA4NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzM4LjkwODMgKyAxMjY3ODcwLjUyODEgKiB0IC0gMTUzLjYzNiAqIHQyZTQgXHJcblx0LSA3LjA2MSAqIHQzZTYgKyAzLjI1OSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwNzggKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDExMS40MDA4ICsgMTc4MTA2OC40NDYxICogdCAtIDY1LjIwMSAqIHQyZTQgXHJcblx0KyA3LjMyOCAqIHQzZTYgLSAzLjUzOCAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwNjkgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDMyMy4zMDI3IC0gMjc4NjQuNDYxOSAqIHQgLSAyMTQuMDc3ICogdDJlNCBcclxuXHQtIDI0Ljk5MCAqIHQzZTYgKyAxMS44MjYgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDY2ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg1MS42MjcxIC0gMTExODY4Ljg2MjMgKiB0ICsgMzYuOTk0ICogdDJlNCBcclxuXHQrIDQuMTkwICogdDNlNiAtIDIuMDAxICogdDRlOCkpIFxyXG5cdCsgMC4wMDA2NSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMzguNTg3MiArIDg1ODYwMi40NjY5ICogdCAtIDEzOC44NzEgKiB0MmU0IFxyXG5cdC0gOC44NTIgKiB0M2U2ICsgNC4xNDQgKiB0NGU4KSkgXHJcblx0LSAwLjAwMDYwICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg4My4zODI2IC0gMTIwMDYuMjk5OCAqIHQgKyAyNDcuOTk5ICogdDJlNCBcclxuXHQrIDI5LjI2MiAqIHQzZTYgLSAxMy44MjYgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDU0ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyMDEuNDc0MCArIDgyNjY3MC43MTA4ICogdCAtIDI0NS4xNDIgKiB0MmU0IFxyXG5cdC0gMjEuMzY3ICogdDNlNiArIDEwLjA1NyAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwNTIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDMwOC40MTkyIC0gNDg5MjA1LjE2NzQgKiB0ICsgMTU4LjAyOSAqIHQyZTQgXHJcblx0KyAxNC45MTUgKiB0M2U2IC0gNy4wMjkgKiB0NGU4KSkgXHJcblx0KyAwLjAwMDQ4ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICg4LjE5MjkgKyAxNDAzNzMyLjE0MTAgKiB0ICsgNTUuODM0ICogdDJlNCBcclxuXHQrIDE4LjA1MiAqIHQzZTYgLSA4LjU2NiAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwNDEgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDQ2LjY4NTMgLSAzOTg3MC43NjE3ICogdCArIDMzLjkyMiAqIHQyZTQgXHJcblx0KyA0LjI3MiAqIHQzZTYgLSAyLjAwMSAqIHQ0ZTgpKSBcclxuXHQtIDAuMDAwMzMgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDI3NC4xOTI4IC0gNTUzMDY4LjY3OTcgKiB0IC0gNTQuNTEzICogdDJlNCBcclxuXHQtIDEwLjExNiAqIHQzZTYgKyA0Ljc5NyAqIHQ0ZTgpKSBcclxuXHQrIDAuMDAwMzAgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDE2MC40MTU5ICsgNDA2Ny4yOTQyICogdCAtIDEwNy44MDYgKiB0MmU0IFxyXG5cdC0gMTIuNDc1ICogdDNlNiArIDUuOTEzICogdDRlOCkpO1xyXG5cclxuXHR2YXIgc2xwID0gMy45NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTE5LjcgKyAxMzEuOCAqIHQpKSBcclxuXHRcdCsgMS45NiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMTI1LjAgLSAxOTM0LjEgKiB0KSk7XHJcblxyXG5cdHZhciBzbHBwID0gMC40NjMgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDM1Ny41ICsgMzU5OTkuMSAqIHQpKSBcclxuXHRcdCsgMC4xNTIgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDIzOC4yICsgODU0NTM1LjIgKiB0KSkgXHJcblx0XHQtIDAuMDcxICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgyNy44ICsgMTMxLjggKiB0KSkgXHJcblx0XHQtIDAuMDU1ICogTWF0aC5zaW4oREVHX1RPX1JBRCAqICgxMDMuMiArIDM3NzMzNi4zICogdCkpIFxyXG5cdFx0LSAwLjAyNiAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjMzLjIgKyA5MjY1MzMuMyAqIHQpKTtcclxuXHJcblx0dmFyIHNscHBwID0gMTQgKiBNYXRoLnNpbihERUdfVE9fUkFEICogKDM1Ny41ICsgMzU5OTkuMSAqIHQpKSBcclxuXHRcdCsgNSAqIE1hdGguc2luKERFR19UT19SQUQgKiAoMjM4LjIgKyA4NTQ1MzUuMiAqIHQpKTtcclxuXHJcblx0dmFyIGxhbWJkYSA9IDIxOC4zMTY2NSArIDQ4MTI2Ny44ODEzNCAqIHQgLSAxMy4yNjggKiB0MmU0IFxyXG5cdFx0KyAxLjg1NiAqIHQzZTYgLSAxLjUzNCAqIHQ0ZTggKyBzbCBcclxuXHRcdCsgMWUtMyAqIChzbHAgKyBzbHBwICogdCArIHNscHBwICogdDJlNCk7XHJcblxyXG5cdHZhciBjb21wdXRlZCA9IHtcclxuXHRcdGEgOiBzbWEgKiAxMDAwLFxyXG5cdFx0ZSA6IGVjYyxcclxuXHRcdGkgOiAyLjAgKiBNYXRoLmFzaW4oZ2FtbWEpICogUkFEX1RPX0RFRyxcclxuXHRcdHcgOiAoIChscCAtIHJhYW4pKSAlIDM2MCxcclxuXHRcdG8gOiAoIHJhYW4pICUgMzYwLFxyXG5cdFx0TSA6ICggKGxhbWJkYSAtIGxwKSkgJSAgMzYwXHJcblx0fTtcclxuXHRcclxuXHRyZXR1cm4gY29tcHV0ZWQ7XHJcblxyXG5cclxufTtcclxuIiwiLypcclxuXHRHbG9iYWwgdmFyc1xyXG4qL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHQvL2dyYXZpdGF0aW9uYWwgY29uc3RhbnQgdG8gbWVhc3VyZSB0aGUgZm9yY2Ugd2l0aCBtYXNzZXMgaW4ga2cgYW5kIHJhZGlpIGluIG1ldGVycyBOKG0va2cpXjJcclxuXHRHIDogNi42NzQyZS0xMSxcclxuXHQvL2FzdHJvbm9taWNhbCB1bml0IGluIGttXHJcblx0QVUgOiAxNDk1OTc4NzAsXHJcblx0Q0lSQ0xFIDogMiAqIE1hdGguUEksXHJcblx0S00gOiAxMDAwLFxyXG5cdERFR19UT19SQUQgOiBNYXRoLlBJLzE4MCxcclxuXHRSQURfVE9fREVHIDogMTgwL01hdGguUEksXHJcblx0Tk1fVE9fS00gOiAxLjg1MixcclxuXHRMQl9UT19LRyA6IDAuNDUzNTkyLFxyXG5cdExCRl9UT19ORVdUT04gOiA0LjQ0ODIyMTYyLFxyXG5cdEZUX1RPX00gOiAwLjMwNDgsXHJcblx0Ly9kdXJhdGlvbiBpbiBzZWNvbmRzXHJcblx0REFZIDogNjAgKiA2MCAqIDI0LFxyXG5cdC8vZHVyYXRpb24gaW4gZGF5c1xyXG5cdFlFQVIgOiAzNjUuMjUsXHJcblx0Ly9kdXJhdGlvbiBpbiBkYXlzXHJcblx0Q0VOVFVSWSA6IDEwMCAqIDM2NS4yNSxcclxuXHRTSURFUkFMX0RBWSA6IDM2MDAgKiAyMy45MzQ0Njk2LFxyXG5cdEoyMDAwIDogbmV3IERhdGUoJzIwMDAtMDEtMDFUMTI6MDA6MDAtMDA6MDAnKSxcclxuXHRnZXRFcG9jaFRpbWUgOiBmdW5jdGlvbih1c2VyRGF0ZSkge1xyXG5cdFx0dXNlckRhdGUgPSB1c2VyRGF0ZSB8fCBuZXcgRGF0ZSgpO1xyXG5cdFx0cmV0dXJuICgodXNlckRhdGUgLSB0aGlzLkoyMDAwKSAvIDEwMDApIDtcclxuXHR9XHJcbn07XHJcbiIsIlxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgbnMgPSByZXF1aXJlKCducycpO1xyXG52YXIgVXRpbHMgPSByZXF1aXJlKCcuL1V0aWxzJyk7XHJcbnZhciBUSFJFRSA9IHJlcXVpcmUoJy4vVGhyZWUuc2hpbScpO1xyXG52YXIgQ01hdGggPSByZXF1aXJlKCcuL01hdGgnKTtcclxuXHJcbnZhciBtYXhJdGVyYXRpb25zRm9yRWNjZW50cmljQW5vbWFseSA9IDEwO1xyXG52YXIgbWF4REUgPSAxZS0xNTtcclxuXHJcbnZhciBzb2x2ZUVjY2VudHJpY0Fub21hbHkgPSBmdW5jdGlvbihmLCB4MCwgbWF4SXRlcikge1xyXG5cdFx0XHJcblx0dmFyIHggPSAwO1xyXG5cdHZhciB4MiA9IHgwO1xyXG5cdFxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbWF4SXRlcjsgaSsrKSB7XHJcblx0XHR4ID0geDI7XHJcblx0XHR4MiA9IGYoeCk7XHJcblx0fVxyXG5cdFxyXG5cdHJldHVybiB4MjtcclxufVxyXG5cclxudmFyIHNvbHZlS2VwbGVyID0gZnVuY3Rpb24oZSwgTSkge1xyXG5cdHJldHVybiBmdW5jdGlvbih4KSB7XHJcblx0XHRyZXR1cm4geCArIChNICsgZSAqIE1hdGguc2luKHgpIC0geCkgLyAoMSAtIGUgKiBNYXRoLmNvcyh4KSk7XHJcblx0fTtcclxufTtcclxuXHJcbnZhciBzb2x2ZUtlcGxlckxhZ3VlcnJlQ29ud2F5ID0gZnVuY3Rpb24oZSwgTSkge1xyXG5cdHJldHVybiBmdW5jdGlvbih4KSB7XHJcblx0XHR2YXIgcyA9IGUgKiBNYXRoLnNpbih4KTtcclxuXHRcdHZhciBjID0gZSAqIE1hdGguY29zKHgpO1xyXG5cdFx0dmFyIGYgPSB4IC0gcyAtIE07XHJcblx0XHR2YXIgZjEgPSAxIC0gYztcclxuXHRcdHZhciBmMiA9IHM7XHJcblxyXG5cdFx0eCArPSAtNSAqIGYgLyAoZjEgKyBDTWF0aC5zaWduKGYxKSAqIE1hdGguc3FydChNYXRoLmFicygxNiAqIGYxICogZjEgLSAyMCAqIGYgKiBmMikpKTtcclxuXHRcdHJldHVybiB4O1xyXG5cdH07XHJcbn07XHJcblxyXG52YXIgc29sdmVLZXBsZXJMYWd1ZXJyZUNvbndheUh5cCA9IGZ1bmN0aW9uKGUsIE0pIHtcclxuXHRyZXR1cm4gZnVuY3Rpb24oeCkge1xyXG5cdFx0dmFyIHMgPSBlICogQ01hdGguc2luaCh4KTtcclxuXHRcdHZhciBjID0gZSAqIENNYXRoLmNvc2goeCk7XHJcblx0XHR2YXIgZiA9IHggLSBzIC0gTTtcclxuXHRcdHZhciBmMSA9IGMgLSAxO1xyXG5cdFx0dmFyIGYyID0gcztcclxuXHJcblx0XHR4ICs9IC01ICogZiAvIChmMSArIENNYXRoLnNpZ24oZjEpICogTWF0aC5zcXJ0KE1hdGguYWJzKDE2ICogZjEgKiBmMSAtIDIwICogZiAqIGYyKSkpO1xyXG5cdFx0cmV0dXJuIHg7XHJcblx0fTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdHNldERlZmF1bHRPcmJpdCA6IGZ1bmN0aW9uKG9yYml0YWxFbGVtZW50cywgY2FsY3VsYXRvcikge1xyXG5cdFx0dGhpcy5vcmJpdGFsRWxlbWVudHMgPSBvcmJpdGFsRWxlbWVudHM7XHJcblx0XHRpZihvcmJpdGFsRWxlbWVudHMgJiYgb3JiaXRhbEVsZW1lbnRzLmVwb2NoKSB7XHJcblx0XHRcdHRoaXMuZXBvY2hDb3JyZWN0aW9uID0gbnMuZ2V0RXBvY2hUaW1lKG9yYml0YWxFbGVtZW50cy5lcG9jaCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmNhbGN1bGF0b3IgPSBjYWxjdWxhdG9yO1xyXG5cdH0sXHJcblxyXG5cdHNldE5hbWUgOiBmdW5jdGlvbihuYW1lKXtcclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblx0fSxcclxuXHJcblx0Y2FsY3VsYXRlVmVsb2NpdHkgOiBmdW5jdGlvbih0aW1lRXBvY2gsIHJlbGF0aXZlVG8sIGlzRnJvbURlbHRhKSB7XHJcblx0XHRpZighdGhpcy5vcmJpdGFsRWxlbWVudHMpIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMygwLDAsMCk7XHJcblxyXG5cdFx0dmFyIGVjbGlwdGljVmVsb2NpdHk7XHJcblx0XHRcclxuXHRcdGlmICggaXNGcm9tRGVsdGEgKSB7XHJcblx0XHRcdHZhciBwb3MxID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbih0aW1lRXBvY2gpO1xyXG5cdFx0XHR2YXIgcG9zMiA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24odGltZUVwb2NoICsgNjApO1xyXG5cdFx0XHRlY2xpcHRpY1ZlbG9jaXR5ID0gcG9zMi5zdWIocG9zMSkubXVsdGlwbHlTY2FsYXIoMS82MCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL3ZpcyB2aXZhIHRvIGNhbGN1bGF0ZSBzcGVlZCAobm90IHZlbG9jaXR5LCBpLmUgbm90IGEgdmVjdG9yKVxyXG5cdFx0XHR2YXIgZWwgPSB0aGlzLmNhbGN1bGF0ZUVsZW1lbnRzKHRpbWVFcG9jaCk7XHJcblx0XHRcdHZhciBzcGVlZCA9IE1hdGguc3FydChucy5HICogcmVxdWlyZSgnLi9Tb2xhclN5c3RlbScpLmdldEJvZHkocmVsYXRpdmVUbykubWFzcyAqICgoMiAvIChlbC5yKSkgLSAoMSAvIChlbC5hKSkpKTtcclxuXHJcblx0XHRcdC8vbm93IGNhbGN1bGF0ZSB2ZWxvY2l0eSBvcmllbnRhdGlvbiwgdGhhdCBpcywgYSB2ZWN0b3IgdGFuZ2VudCB0byB0aGUgb3JiaXRhbCBlbGxpcHNlXHJcblx0XHRcdHZhciBrID0gZWwuciAvIGVsLmE7XHJcblx0XHRcdHZhciBvID0gKCgyIC0gKDIgKiBlbC5lICogZWwuZSkpIC8gKGsgKiAoMi1rKSkpLTE7XHJcblx0XHRcdC8vZmxvYXRpbmcgcG9pbnQgaW1wcmVjaXNpb25cclxuXHRcdFx0byA9IG8gPiAxID8gMSA6IG87XHJcblx0XHRcdHZhciBhbHBoYSA9IE1hdGguUEkgLSBNYXRoLmFjb3Mobyk7XHJcblx0XHRcdGFscGhhID0gZWwudiA8IDAgPyAoMiAqIE1hdGguUEkpIC0gYWxwaGEgIDogYWxwaGE7XHJcblx0XHRcdHZhciB2ZWxvY2l0eUFuZ2xlID0gZWwudiArIChhbHBoYSAvIDIpO1xyXG5cdFx0XHQvL3ZlbG9jaXR5IHZlY3RvciBpbiB0aGUgcGxhbmUgb2YgdGhlIG9yYml0XHJcblx0XHRcdHZhciBvcmJpdGFsVmVsb2NpdHkgPSBuZXcgVEhSRUUuVmVjdG9yMyhNYXRoLmNvcyh2ZWxvY2l0eUFuZ2xlKSwgTWF0aC5zaW4odmVsb2NpdHlBbmdsZSkpLnNldExlbmd0aChzcGVlZCk7XHJcblx0XHRcdHZhciB2ZWxvY2l0eUVscyA9IFV0aWxzLmV4dGVuZCh7fSwgZWwsIHtwb3M6b3JiaXRhbFZlbG9jaXR5LCB2Om51bGwsIHI6bnVsbH0pO1xyXG5cdFx0XHRlY2xpcHRpY1ZlbG9jaXR5ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FbGVtZW50cyh2ZWxvY2l0eUVscyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly92YXIgZGlmZiA9IGVjbGlwdGljVmVsb2NpdHlGcm9tRGVsdGEuc3ViKGVjbGlwdGljVmVsb2NpdHkpO2NvbnNvbGUubG9nKGRpZmYubGVuZ3RoKCkpO1xyXG5cdFx0cmV0dXJuIGVjbGlwdGljVmVsb2NpdHk7XHJcblx0XHRcclxuXHR9LFxyXG5cclxuXHRjYWxjdWxhdGVQb3NpdGlvbiA6IGZ1bmN0aW9uKHRpbWVFcG9jaCkge1xyXG5cdFx0aWYoIXRoaXMub3JiaXRhbEVsZW1lbnRzKSByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoMCwwLDApO1xyXG5cdFx0dmFyIGNvbXB1dGVkID0gdGhpcy5jYWxjdWxhdGVFbGVtZW50cyh0aW1lRXBvY2gpO1xyXG5cdFx0dmFyIHBvcyA9ICB0aGlzLmdldFBvc2l0aW9uRnJvbUVsZW1lbnRzKGNvbXB1dGVkKTtcclxuXHRcdHJldHVybiBwb3M7XHJcblx0fSxcclxuXHJcblx0c29sdmVFY2NlbnRyaWNBbm9tYWx5IDogZnVuY3Rpb24oZSwgTSl7XHJcblx0XHRpZiAoZSA9PSAwLjApIHtcclxuXHRcdFx0cmV0dXJuIE07XHJcblx0XHR9ICBlbHNlIGlmIChlIDwgMC45KSB7XHJcblx0XHRcdHZhciBzb2wgPSBzb2x2ZUVjY2VudHJpY0Fub21hbHkoc29sdmVLZXBsZXIoZSwgTSksIE0sIDYpO1xyXG5cdFx0XHRyZXR1cm4gc29sO1xyXG5cdFx0fSBlbHNlIGlmIChlIDwgMS4wKSB7XHJcblx0XHRcdHZhciBFID0gTSArIDAuODUgKiBlICogKChNYXRoLnNpbihNKSA+PSAwLjApID8gMSA6IC0xKTtcclxuXHRcdFx0dmFyIHNvbCA9IHNvbHZlRWNjZW50cmljQW5vbWFseShzb2x2ZUtlcGxlckxhZ3VlcnJlQ29ud2F5KGUsIE0pLCBFLCA4KTtcclxuXHRcdFx0cmV0dXJuIHNvbDtcclxuXHRcdH0gZWxzZSBpZiAoZSA9PSAxLjApIHtcclxuXHRcdFx0cmV0dXJuIE07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgRSA9IE1hdGgubG9nKDIgKiBNIC8gZSArIDEuODUpO1xyXG5cdFx0XHR2YXIgc29sID0gc29sdmVFY2NlbnRyaWNBbm9tYWx5KHNvbHZlS2VwbGVyTGFndWVycmVDb253YXlIeXAoZSwgTSksIEUsIDMwKTtcclxuXHRcdFx0cmV0dXJuIHNvbDtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYWxjdWxhdGVFbGVtZW50cyA6IGZ1bmN0aW9uKHRpbWVFcG9jaCwgZm9yY2VkT3JiaXRhbEVsZW1lbnRzKSB7XHJcblx0XHRpZighZm9yY2VkT3JiaXRhbEVsZW1lbnRzICYmICF0aGlzLm9yYml0YWxFbGVtZW50cykgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0dmFyIG9yYml0YWxFbGVtZW50cyA9IGZvcmNlZE9yYml0YWxFbGVtZW50cyB8fCB0aGlzLm9yYml0YWxFbGVtZW50cztcclxuXHJcblx0XHQvKlxyXG5cclxuXHRcdEVwb2NoIDogSjIwMDBcclxuXHJcblx0XHRhIFx0U2VtaS1tYWpvciBheGlzXHJcblx0ICAgIGUgXHRFY2NlbnRyaWNpdHlcclxuXHQgICAgaSBcdEluY2xpbmF0aW9uXHJcblx0ICAgIG8gXHRMb25naXR1ZGUgb2YgQXNjZW5kaW5nIE5vZGUgKM6pKVxyXG5cdCAgICB3IFx0QXJndW1lbnQgb2YgcGVyaWFwc2lzICjPiSlcclxuXHRcdEUgXHRFY2NlbnRyaWMgQW5vbWFseVxyXG5cdCAgICBUIFx0VGltZSBhdCBwZXJpaGVsaW9uXHJcblx0ICAgIE1cdE1lYW4gYW5vbWFseVxyXG5cdCAgICBsIFx0TWVhbiBMb25naXR1ZGVcclxuXHQgICAgbHBcdGxvbmdpdHVkZSBvZiBwZXJpYXBzaXNcclxuXHQgICAgclx0ZGlzdGFuY2UgZHUgY2VudHJlXHJcblx0ICAgIHZcdHRydWUgYW5vbWFseVxyXG5cclxuXHQgICAgUFx0U2lkZXJlYWwgcGVyaW9kIChtZWFuIHZhbHVlKVxyXG5cdFx0UHdcdEFyZ3VtZW50IG9mIHBlcmlhcHNpcyBwcmVjZXNzaW9uIHBlcmlvZCAobWVhbiB2YWx1ZSlcclxuXHRcdFBuXHRMb25naXR1ZGUgb2YgdGhlIGFzY2VuZGluZyBub2RlIHByZWNlc3Npb24gcGVyaW9kIChtZWFuIHZhbHVlKVxyXG5cclxuXHQgICAgKi9cclxuXHQgICAgaWYgKHRoaXMuZXBvY2hDb3JyZWN0aW9uKSB7XHJcblx0ICAgIFx0dGltZUVwb2NoIC09IHRoaXMuZXBvY2hDb3JyZWN0aW9uO1xyXG5cdCAgICB9XHJcblx0XHR2YXIgdERheXMgPSB0aW1lRXBvY2ggLyBucy5EQVk7XHJcblx0XHR2YXIgVCA9IHREYXlzIC8gbnMuQ0VOVFVSWSA7XHJcblx0XHQvL2NvbnNvbGUubG9nKFQpO1xyXG5cdFx0dmFyIGNvbXB1dGVkID0ge1xyXG5cdFx0XHR0IDogdGltZUVwb2NoXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmKHRoaXMuY2FsY3VsYXRvciAmJiAhZm9yY2VkT3JiaXRhbEVsZW1lbnRzKSB7XHJcblx0XHRcdHZhciByZWFsb3JiaXQgPSB0aGlzLmNhbGN1bGF0b3IoVCk7XHJcblx0XHRcdFV0aWxzLmV4dGVuZChjb21wdXRlZCwgcmVhbG9yYml0KTtcclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAob3JiaXRhbEVsZW1lbnRzLmJhc2UpIHtcclxuXHRcdFx0XHR2YXIgdmFyaWF0aW9uO1xyXG5cdFx0XHRcdGZvcih2YXIgZWwgaW4gb3JiaXRhbEVsZW1lbnRzLmJhc2UpIHtcclxuXHRcdFx0XHRcdC8vY3kgOiB2YXJpYXRpb24gYnkgY2VudHVyeS5cclxuXHRcdFx0XHRcdC8vZGF5IDogdmFyaWF0aW9uIGJ5IGRheS5cclxuXHRcdFx0XHRcdHZhcmlhdGlvbiA9IG9yYml0YWxFbGVtZW50cy5jeSA/IG9yYml0YWxFbGVtZW50cy5jeVtlbF0gOiAob3JiaXRhbEVsZW1lbnRzLmRheVtlbF0gKiBucy5DRU5UVVJZKTtcclxuXHRcdFx0XHRcdHZhcmlhdGlvbiA9IHZhcmlhdGlvbiB8fCAwO1xyXG5cdFx0XHRcdFx0Y29tcHV0ZWRbZWxdID0gb3JiaXRhbEVsZW1lbnRzLmJhc2VbZWxdICsgKHZhcmlhdGlvbiAqIFQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb21wdXRlZCA9IFV0aWxzLmV4dGVuZCh7fSwgb3JiaXRhbEVsZW1lbnRzKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHVuZGVmaW5lZCA9PT0gY29tcHV0ZWQudykge1xyXG5cdFx0XHRcdGNvbXB1dGVkLncgPSBjb21wdXRlZC5scCAtIGNvbXB1dGVkLm87XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh1bmRlZmluZWQgPT09IGNvbXB1dGVkLk0pIHtcclxuXHRcdFx0XHRjb21wdXRlZC5NID0gY29tcHV0ZWQubCAtIGNvbXB1dGVkLmxwO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb21wdXRlZC5hID0gY29tcHV0ZWQuYSAqIG5zLktNOy8vd2FzIGluIGttLCBzZXQgaXQgaW4gbVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRjb21wdXRlZC5pID0gbnMuREVHX1RPX1JBRCAqIGNvbXB1dGVkLmk7XHJcblx0XHRjb21wdXRlZC5vID0gbnMuREVHX1RPX1JBRCAqIGNvbXB1dGVkLm87XHJcblx0XHRjb21wdXRlZC53ID0gbnMuREVHX1RPX1JBRCAqIGNvbXB1dGVkLnc7XHJcblx0XHRjb21wdXRlZC5NID0gbnMuREVHX1RPX1JBRCAqIGNvbXB1dGVkLk07XHJcblxyXG5cdFx0Y29tcHV0ZWQuRSA9IHRoaXMuc29sdmVFY2NlbnRyaWNBbm9tYWx5KGNvbXB1dGVkLmUsIGNvbXB1dGVkLk0pO1xyXG5cclxuXHRcdGNvbXB1dGVkLkUgPSBjb21wdXRlZC5FICUgbnMuQ0lSQ0xFO1xyXG5cdFx0Y29tcHV0ZWQuaSA9IGNvbXB1dGVkLmkgJSBucy5DSVJDTEU7XHJcblx0XHRjb21wdXRlZC5vID0gY29tcHV0ZWQubyAlIG5zLkNJUkNMRTtcclxuXHRcdGNvbXB1dGVkLncgPSBjb21wdXRlZC53ICUgbnMuQ0lSQ0xFO1xyXG5cdFx0Y29tcHV0ZWQuTSA9IGNvbXB1dGVkLk0gJSBucy5DSVJDTEU7XHJcblxyXG5cdFx0Ly9pbiB0aGUgcGxhbmUgb2YgdGhlIG9yYml0XHJcblx0XHRjb21wdXRlZC5wb3MgPSBuZXcgVEhSRUUuVmVjdG9yMyhjb21wdXRlZC5hICogKE1hdGguY29zKGNvbXB1dGVkLkUpIC0gY29tcHV0ZWQuZSksIGNvbXB1dGVkLmEgKiAoTWF0aC5zcXJ0KDEgLSAoY29tcHV0ZWQuZSpjb21wdXRlZC5lKSkpICogTWF0aC5zaW4oY29tcHV0ZWQuRSkpO1xyXG5cclxuXHRcdGNvbXB1dGVkLnIgPSBjb21wdXRlZC5wb3MubGVuZ3RoKCk7XHJcblx0XHRjb21wdXRlZC52ID0gTWF0aC5hdGFuMihjb21wdXRlZC5wb3MueSwgY29tcHV0ZWQucG9zLngpO1xyXG5cdFx0aWYob3JiaXRhbEVsZW1lbnRzLnJlbGF0aXZlVG8pIHtcclxuXHRcdFx0dmFyIHJlbGF0aXZlVG8gPSByZXF1aXJlKCcuL1NvbGFyU3lzdGVtJykuZ2V0Qm9keShvcmJpdGFsRWxlbWVudHMucmVsYXRpdmVUbyk7XHJcblx0XHRcdGlmKHJlbGF0aXZlVG8udGlsdCkge1xyXG5cdFx0XHRcdGNvbXB1dGVkLnRpbHQgPSAtcmVsYXRpdmVUby50aWx0ICogbnMuREVHX1RPX1JBRDtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHJldHVybiBjb21wdXRlZDtcclxuXHR9LFxyXG5cclxuXHRnZXRQb3NpdGlvbkZyb21FbGVtZW50cyA6IGZ1bmN0aW9uKGNvbXB1dGVkKSB7XHJcblxyXG5cdFx0aWYoIWNvbXB1dGVkKSByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoMCwwLDApO1xyXG5cclxuXHRcdHZhciBhMSA9IG5ldyBUSFJFRS5FdWxlcihjb21wdXRlZC50aWx0IHx8IDAsIDAsIGNvbXB1dGVkLm8sICdYWVonKTtcclxuXHRcdHZhciBxMSA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbUV1bGVyKGExKTtcclxuXHRcdHZhciBhMiA9IG5ldyBUSFJFRS5FdWxlcihjb21wdXRlZC5pLCAwLCBjb21wdXRlZC53LCAnWFlaJyk7XHJcblx0XHR2YXIgcTIgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihhMik7XHJcblxyXG5cdFx0dmFyIHBsYW5lUXVhdCA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhxMSwgcTIpO1xyXG5cdFx0Y29tcHV0ZWQucG9zLmFwcGx5UXVhdGVybmlvbihwbGFuZVF1YXQpO1xyXG5cdFx0cmV0dXJuIGNvbXB1dGVkLnBvcztcclxuXHR9LFxyXG5cclxuXHRjYWxjdWxhdGVQZXJpb2QgOiBmdW5jdGlvbihlbGVtZW50cywgcmVsYXRpdmVUbykge1xyXG5cdFx0dmFyIHBlcmlvZDtcclxuXHRcdGlmKHRoaXMub3JiaXRhbEVsZW1lbnRzICYmIHRoaXMub3JiaXRhbEVsZW1lbnRzLmRheSAmJiB0aGlzLm9yYml0YWxFbGVtZW50cy5kYXkuTSkge1xyXG5cdFx0XHRwZXJpb2QgPSAzNjAgLyB0aGlzLm9yYml0YWxFbGVtZW50cy5kYXkuTSA7XHJcblx0XHR9ZWxzZSBpZihyZXF1aXJlKCcuL1NvbGFyU3lzdGVtJykuZ2V0Qm9keShyZWxhdGl2ZVRvKSAmJiByZXF1aXJlKCcuL1NvbGFyU3lzdGVtJykuZ2V0Qm9keShyZWxhdGl2ZVRvKS5rICYmIGVsZW1lbnRzKSB7XHJcblx0XHRcdHBlcmlvZCA9IDIgKiBNYXRoLlBJICogTWF0aC5zcXJ0KE1hdGgucG93KGVsZW1lbnRzLmEvKG5zLkFVKjEwMDApLCAzKSkgLyByZXF1aXJlKCcuL1NvbGFyU3lzdGVtJykuZ2V0Qm9keShyZWxhdGl2ZVRvKS5rO1xyXG5cdFx0fVxyXG5cdFx0cGVyaW9kICo9IG5zLkRBWTsvL2luIHNlY29uZHNcclxuXHRcdHJldHVybiBwZXJpb2Q7XHJcblx0fVxyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBucyA9IHJlcXVpcmUoJ25zJyk7XG52YXIgVXRpbHMgPSByZXF1aXJlKCcuL1V0aWxzJyk7XG52YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCcuL0RlZmluaXRpb25zJyk7XG52YXIgQ2VsZXN0aWFsQm9keSA9IHJlcXVpcmUoJy4vQ2VsZXN0aWFsQm9keScpO1xuXG5cbnZhciBib2RpZXMgPSBkZWZpbml0aW9ucy5tYXAoZnVuY3Rpb24oZGVmKXtcblx0dmFyIGJvZHkgPSBPYmplY3QuY3JlYXRlKENlbGVzdGlhbEJvZHkpO1xuXHRVdGlscy5leHRlbmQoYm9keSwgZGVmKTtcblx0Ym9keS5pbml0KCk7XG5cdHJldHVybiBib2R5O1xufSk7XG5cbnZhciBuYW1lcyA9IGJvZGllcy5yZWR1Y2UoZnVuY3Rpb24oY2FycnksIGJvZHkpe1xuXHRjYXJyeVtib2R5Lm5hbWVdID0gYm9keTtcblx0cmV0dXJuIGNhcnJ5O1xufSwge30pO1xuXG52YXIgY2VudHJhbCA9IGJvZGllcy5yZWR1Y2UoZnVuY3Rpb24oY2FycnksIGJvZHkpe1xuXHRjYXJyeSA9IGNhcnJ5ICYmIGNhcnJ5Lm1hc3MgPiBib2R5Lm1hc3MgPyBjYXJyeSA6IGJvZHk7XG5cdHJldHVybiBjYXJyeTtcbn0sIG51bGwpO1xuXG5cbmNvbnNvbGUubG9nKGJvZGllcyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRnZXRCb2R5OiBmdW5jdGlvbihuYW1lKXtcblx0XHRyZXR1cm4gbmFtZXNbbmFtZV0gfHwgY2VudHJhbDtcblx0fSxcblx0Z2V0UG9zaXRpb25zOiBmdW5jdGlvbih1c2VyRGF0ZSwgY2FsY3VsYXRlVmVsb2NpdHkpe1xuXHRcdHZhciBlcG9jaFRpbWUgPSBucy5nZXRFcG9jaFRpbWUodXNlckRhdGUpO1xuXHRcdHJldHVybiBib2RpZXMubWFwKGZ1bmN0aW9uKGJvZHkpe1xuXHRcdFx0Ym9keS5zZXRQb3NpdGlvbkZyb21EYXRlKGVwb2NoVGltZSwgY2FsY3VsYXRlVmVsb2NpdHkpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bmFtZTogYm9keS5uYW1lLFxuXHRcdFx0XHRwb3NpdGlvbjogYm9keS5nZXRQb3NpdGlvbigpLFxuXHRcdFx0XHR2ZWxvY2l0eTogYm9keS5nZXRWZWxvY2l0eSgpXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG59OyIsIlxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgVEhSRUUgPSBnbG9iYWwuVEhSRUUgPSB7fTtcblxucmVxdWlyZSgnLi4vdmVuZG9yL3RocmVlL21hdGgvVmVjdG9yMycpO1xucmVxdWlyZSgnLi4vdmVuZG9yL3RocmVlL21hdGgvUXVhdGVybmlvbicpO1xucmVxdWlyZSgnLi4vdmVuZG9yL3RocmVlL21hdGgvRXVsZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUSFJFRTsiLCIvKlxyXG5cdEdsb2JhbCB2YXJzXHJcbiovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZXh0ZW5kID0gZnVuY3Rpb24oKXtcclxuXHRpZihhcmd1bWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gYXJndW1lbnRzWzBdO1xyXG5cdHZhciBzb3VyY2UgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLCAxLCAxKVswXTtcclxuXHRhcmd1bWVudHNbMF0gPSBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbihjYXJyeSwga2V5KXtcclxuXHRcdGNhcnJ5W2tleV0gPSBzb3VyY2Vba2V5XTtcclxuXHRcdHJldHVybiBjYXJyeTtcclxuXHR9LCBhcmd1bWVudHNbMF0pO1xyXG5cdHJldHVybiBleHRlbmQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdGV4dGVuZDogZXh0ZW5kXHJcbn07XHJcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9leG9jb3J0ZXguY29tXG4gKi9cblxuVEhSRUUuRXVsZXIgPSBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgVEhSRUUuRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59O1xuXG5USFJFRS5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5USFJFRS5FdWxlci5EZWZhdWx0T3JkZXIgPSAnWFlaJztcblxuVEhSRUUuRXVsZXIucHJvdG90eXBlID0ge1xuXG5cdGNvbnN0cnVjdG9yOiBUSFJFRS5FdWxlcixcblxuXHRfeDogMCwgX3k6IDAsIF96OiAwLCBfb3JkZXI6IFRIUkVFLkV1bGVyLkRlZmF1bHRPcmRlcixcblxuXHRnZXQgeCAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHR9LFxuXG5cdHNldCB4ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgeSAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHR9LFxuXG5cdHNldCB5ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgeiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHR9LFxuXG5cdHNldCB6ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgb3JkZXIgKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX29yZGVyO1xuXG5cdH0sXG5cblx0c2V0IG9yZGVyICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5feCA9IGV1bGVyLl94O1xuXHRcdHRoaXMuX3kgPSBldWxlci5feTtcblx0XHR0aGlzLl96ID0gZXVsZXIuX3o7XG5cdFx0dGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHR2YXIgY2xhbXAgPSBUSFJFRS5NYXRoLmNsYW1wO1xuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF07XG5cdFx0dmFyIG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF07XG5cdFx0dmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0b3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCBjbGFtcCggbTEzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMzEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl95ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0VEhSRUUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICcgKyBvcmRlciApXG5cblx0XHR9XG5cblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggcSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdFx0aWYgKCBtYXRyaXggPT09IHVuZGVmaW5lZCApIG1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7XG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblx0XHRcdHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgfHwgdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdHJlb3JkZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdBUk5JTkc6IHRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbiAtYmhvdXN0b25cblxuXHRcdHZhciBxID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXHRcdFx0dGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblx0fSxcblxuXHR0b1ZlY3RvcjM6IGZ1bmN0aW9uICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRpZiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0XHRyZXR1cm4gb3B0aW9uYWxSZXN1bHQuc2V0KCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFRIUkVFLkV1bGVyKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH1cblxufTtcbiIsIi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vZXhvY29ydGV4LmNvbVxuICovXG5cblRIUkVFLlF1YXRlcm5pb24gPSBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fdyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTtcblxufTtcblxuVEhSRUUuUXVhdGVybmlvbi5wcm90b3R5cGUgPSB7XG5cblx0Y29uc3RydWN0b3I6IFRIUkVFLlF1YXRlcm5pb24sXG5cblx0X3g6IDAsX3k6IDAsIF96OiAwLCBfdzogMCxcblxuXHRnZXQgeCAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHR9LFxuXG5cdHNldCB4ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgeSAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHR9LFxuXG5cdHNldCB5ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgeiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHR9LFxuXG5cdHNldCB6ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRnZXQgdyAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHR9LFxuXG5cdHNldCB3ICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLl93ID0gdmFsdWU7XG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX3cgPSB3O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoIGV1bGVyIGluc3RhbmNlb2YgVEhSRUUuRXVsZXIgPT09IGZhbHNlICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblx0XHR9XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgYzEgPSBNYXRoLmNvcyggZXVsZXIuX3ggLyAyICk7XG5cdFx0dmFyIGMyID0gTWF0aC5jb3MoIGV1bGVyLl95IC8gMiApO1xuXHRcdHZhciBjMyA9IE1hdGguY29zKCBldWxlci5feiAvIDIgKTtcblx0XHR2YXIgczEgPSBNYXRoLnNpbiggZXVsZXIuX3ggLyAyICk7XG5cdFx0dmFyIHMyID0gTWF0aC5zaW4oIGV1bGVyLl95IC8gMiApO1xuXHRcdHZhciBzMyA9IE1hdGguc2luKCBldWxlci5feiAvIDIgKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGh0dHA6Ly9sb2xlbmdpbmUubmV0L2Jsb2cvMjAxNC8wMi8yNC9xdWF0ZXJuaW9uLWZyb20tdHdvLXZlY3RvcnMtZmluYWxcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxLCByO1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggdkZyb20sIHZUbyApIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5cdFx0XHRyID0gdkZyb20uZG90KCB2VG8gKSArIDE7XG5cblx0XHRcdGlmICggciA8IEVQUyApIHtcblxuXHRcdFx0XHRyID0gMDtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAtIHZGcm9tLnksIHZGcm9tLngsIDAgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAwLCAtIHZGcm9tLnosIHZGcm9tLnkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0djEuY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5feCA9IHYxLng7XG5cdFx0XHR0aGlzLl95ID0gdjEueTtcblx0XHRcdHRoaXMuX3ogPSB2MS56O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdH0oKSxcblxuXHRpbnZlcnNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbmp1Z2F0ZSgpLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb25qdWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7XG5cblx0XHRpZiAoIHAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0VEhSRUUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5UXVhdGVybmlvbnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxuXG5cdFx0dmFyIHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XG5cdFx0dmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRUSFJFRS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwL1xuXG5cdFx0dmFyIGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejtcblxuXHRcdGlmICggY29zSGFsZlRoZXRhIDwgMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IC0gcWIuX3c7XG5cdFx0XHR0aGlzLl94ID0gLSBxYi5feDtcblx0XHRcdHRoaXMuX3kgPSAtIHFiLl95O1xuXHRcdFx0dGhpcy5feiA9IC0gcWIuX3o7XG5cblx0XHRcdGNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdztcblx0XHRcdHRoaXMuX3ggPSB4O1xuXHRcdFx0dGhpcy5feSA9IHk7XG5cdFx0XHR0aGlzLl96ID0gejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZlRoZXRhID0gTWF0aC5hY29zKCBjb3NIYWxmVGhldGEgKTtcblx0XHR2YXIgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NIYWxmVGhldGEgKTtcblxuXHRcdGlmICggTWF0aC5hYnMoIHNpbkhhbGZUaGV0YSApIDwgMC4wMDEgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAwLjUgKiAoIHcgKyB0aGlzLl93ICk7XG5cdFx0XHR0aGlzLl94ID0gMC41ICogKCB4ICsgdGhpcy5feCApO1xuXHRcdFx0dGhpcy5feSA9IDAuNSAqICggeSArIHRoaXMuX3kgKTtcblx0XHRcdHRoaXMuX3ogPSAwLjUgKiAoIHogKyB0aGlzLl96ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcblx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgVEhSRUUuUXVhdGVybmlvbiggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH1cblxufTtcblxuVEhSRUUuUXVhdGVybmlvbi5zbGVycCA9IGZ1bmN0aW9uICggcWEsIHFiLCBxbSwgdCApIHtcblxuXHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxufVxuIiwiLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciAqa2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cblRIUkVFLlZlY3RvcjMgPSBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblxufTtcblxuVEhSRUUuVmVjdG9yMy5wcm90b3R5cGUgPSB7XG5cblx0Y29uc3RydWN0b3I6IFRIUkVFLlZlY3RvcjMsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0VEhSRUUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFRIUkVFLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXHRcblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0VEhSRUUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cdFx0dGhpcy56ICo9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5VmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICogYi54O1xuXHRcdHRoaXMueSA9IGEueSAqIGIueTtcblx0XHR0aGlzLnogPSBhLnogKiBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5RXVsZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRcdGlmICggZXVsZXIgaW5zdGFuY2VvZiBUSFJFRS5FdWxlciA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0VEhSRUUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBxdWF0ZXJuaW9uID09PSB1bmRlZmluZWQgKSBxdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcblxuXHRcdFx0dGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdGlmICggcXVhdGVybmlvbiA9PT0gdW5kZWZpbmVkICkgcXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XG5cblx0XHRcdHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54O1xuXHRcdHZhciB5ID0gdGhpcy55O1xuXHRcdHZhciB6ID0gdGhpcy56O1xuXG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAgKiB6ICsgZVsgMTIgXTtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6ICsgZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBwcm9qZWN0aW9uIG1hdHJpeFxuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIGQgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApOyAvLyBwZXJzcGVjdGl2ZSBkaXZpZGVcblxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gICogeiArIGVbIDEyIF0gKSAqIGQ7XG5cdFx0dGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6ICsgZVsgMTMgXSApICogZDtcblx0XHR0aGlzLnogPSAoIGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICkgKiBkO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54O1xuXHRcdHZhciB5ID0gdGhpcy55O1xuXHRcdHZhciB6ID0gdGhpcy56O1xuXG5cdFx0dmFyIHF4ID0gcS54O1xuXHRcdHZhciBxeSA9IHEueTtcblx0XHR2YXIgcXogPSBxLno7XG5cdFx0dmFyIHF3ID0gcS53O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHF1YXQgKiB2ZWN0b3JcblxuXHRcdHZhciBpeCA9ICBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG5cdFx0dmFyIGl5ID0gIHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSAgcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuXHRcdHZhciBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG5cdFx0dGhpcy54ID0gaXggKiBxdyArIGl3ICogLSBxeCArIGl5ICogLSBxeiAtIGl6ICogLSBxeTtcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6O1xuXHRcdHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXg7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRcdGlmICggbWF0cml4ID09PSB1bmRlZmluZWQgKSBtYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlQcm9qZWN0aW9uKCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIGNhbWVyYSApIHtcblxuXHRcdFx0aWYgKCBtYXRyaXggPT09IHVuZGVmaW5lZCApIG1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVByb2plY3Rpb24oIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblxuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6O1xuXG5cdFx0dGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdGlmICggc2NhbGFyICE9PSAwICkge1xuXG5cdFx0XHR2YXIgaW52U2NhbGFyID0gMSAvIHNjYWxhcjtcblxuXHRcdFx0dGhpcy54ICo9IGludlNjYWxhcjtcblx0XHRcdHRoaXMueSAqPSBpbnZTY2FsYXI7XG5cdFx0XHR0aGlzLnogKj0gaW52U2NhbGFyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gMDtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGlmICggdGhpcy54ID4gdi54ICkge1xuXG5cdFx0XHR0aGlzLnggPSB2Lng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMueSA+IHYueSApIHtcblxuXHRcdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnogPiB2LnogKSB7XG5cblx0XHRcdHRoaXMueiA9IHYuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRpZiAoIHRoaXMueCA8IHYueCApIHtcblxuXHRcdFx0dGhpcy54ID0gdi54O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnkgPCB2LnkgKSB7XG5cblx0XHRcdHRoaXMueSA9IHYueTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy56IDwgdi56ICkge1xuXG5cdFx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIG1pbiA8IG1heCwgaWYgdGhpcyBhc3N1bXB0aW9uIGlzbid0IHRydWUgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHlcblxuXHRcdGlmICggdGhpcy54IDwgbWluLnggKSB7XG5cblx0XHRcdHRoaXMueCA9IG1pbi54O1xuXG5cdFx0fSBlbHNlIGlmICggdGhpcy54ID4gbWF4LnggKSB7XG5cblx0XHRcdHRoaXMueCA9IG1heC54O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnkgPCBtaW4ueSApIHtcblxuXHRcdFx0dGhpcy55ID0gbWluLnk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLnkgPiBtYXgueSApIHtcblxuXHRcdFx0dGhpcy55ID0gbWF4Lnk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMueiA8IG1pbi56ICkge1xuXG5cdFx0XHR0aGlzLnogPSBtaW4uejtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMueiA+IG1heC56ICkge1xuXG5cdFx0XHR0aGlzLnogPSBtYXguejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdGlmICggbWluID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWluID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblx0XHRcdFx0bWF4ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsICkge1xuXG5cdFx0dmFyIG9sZExlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIG9sZExlbmd0aCAhPT0gMCAmJiBsICE9PSBvbGRMZW5ndGggICkge1xuXG5cdFx0XHR0aGlzLm11bHRpcGx5U2NhbGFyKCBsIC8gb2xkTGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y3Jvc3M6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRUSFJFRS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXG5cdFx0dGhpcy54ID0geSAqIHYueiAtIHogKiB2Lnk7XG5cdFx0dGhpcy55ID0geiAqIHYueCAtIHggKiB2Lno7XG5cdFx0dGhpcy56ID0geCAqIHYueSAtIHkgKiB2Lng7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEsIGRvdDtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5cdFx0XHR2MS5jb3B5KCB2ZWN0b3IgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0ZG90ID0gdGhpcy5kb3QoIHYxICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNvcHkoIHYxICkubXVsdGlwbHlTY2FsYXIoIGRvdCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cHJvamVjdE9uUGxhbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEgKTtcblxuXHRcdH1cblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggbm9ybWFsICkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fVxuXG5cdH0oKSxcblxuXHRhbmdsZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gKCB0aGlzLmxlbmd0aCgpICogdi5sZW5ndGgoKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIFRIUkVFLk1hdGguY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54O1xuXHRcdHZhciBkeSA9IHRoaXMueSAtIHYueTtcblx0XHR2YXIgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH0sXG5cblx0c2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIgKSB7XG5cblx0XHRUSFJFRS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXG5cdHNldEV1bGVyRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSwgb3JkZXIgKSB7XG5cblx0XHRUSFJFRS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdFRIUkVFLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblxuXHRnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdFRIUkVFLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7XG5cdH0sXG5cblx0Z2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkge1xuXG5cdFx0VEhSRUUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIGluZGV4LCBtYXRyaXggKTtcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dGhpcy54ID0gbS5lbGVtZW50c1sgMTIgXTtcblx0XHR0aGlzLnkgPSBtLmVsZW1lbnRzWyAxMyBdO1xuXHRcdHRoaXMueiA9IG0uZWxlbWVudHNbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhTY2FsZTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHN4ID0gdGhpcy5zZXQoIG0uZWxlbWVudHNbIDAgXSwgbS5lbGVtZW50c1sgMSBdLCBtLmVsZW1lbnRzWyAgMiBdICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN5ID0gdGhpcy5zZXQoIG0uZWxlbWVudHNbIDQgXSwgbS5lbGVtZW50c1sgNSBdLCBtLmVsZW1lbnRzWyAgNiBdICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN6ID0gdGhpcy5zZXQoIG0uZWxlbWVudHNbIDggXSwgbS5lbGVtZW50c1sgOSBdLCBtLmVsZW1lbnRzWyAxMCBdICkubGVuZ3RoKCk7XG5cblx0XHR0aGlzLnggPSBzeDtcblx0XHR0aGlzLnkgPSBzeTtcblx0XHR0aGlzLnogPSBzejtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblx0XHRcblx0XHR2YXIgb2Zmc2V0ID0gaW5kZXggKiA0O1xuXG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gbWVbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IG1lWyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gbWVbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGluZGV4ID0gaW5kZXggKiBhdHRyaWJ1dGUuaXRlbVNpemUgKyBvZmZzZXQ7XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4IF07XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmFycmF5WyBpbmRleCArIDEgXTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7XG5cblx0fVxuXG59O1xuIl19