{
  "version": 3,
  "sources": [
    "node_modules/browserify/node_modules/browser-pack/_prelude.js",
    "/Users/johann/Development/network.js/lib/EventDispatcher.js",
    "/Users/johann/Development/network.js/lib/Http/BandwidthModule.js",
    "/Users/johann/Development/network.js/lib/Http/HttpModule.js",
    "/Users/johann/Development/network.js/lib/Http/LatencyModule.js",
    "/Users/johann/Development/network.js/lib/Network.js",
    "/Users/johann/Development/network.js/lib/Timing.js",
    "/Users/johann/Development/network.js/utils/decorators.js",
    "/Users/johann/Development/network.js/utils/helpers.js"
  ],
  "names": [],
  "mappings": "AAAA;;;;;;;;;;;;;+BCAyB,qBAAqB;;;;;;;;;;;;;;IAazB,eAAe;;;aAAf,eAAe;8BAAf,eAAe;;;;;0BAAf,eAAe;;;;;;;;;;;eAkB9B,YAAC,MAAM,EAAE,QAAQ,EACnB;;;AACI,kBAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;;AAEnD,kBAAM,CAAC,OAAO,CAAC,UAAA,KAAK,EAAI;AACpB,oBAAI,cAAc,GAAG,MAAK,eAAe,CAAC,KAAK,CAAC,GAAG,MAAK,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;;;AAGrF,oBAAI,EAAC,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACpC,kCAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACjC;aACJ,CAAC,CAAC;;AAEH,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;;eAUE,aAAC,MAAM,EACV;;;gBADY,QAAQ,yDAAG,IAAI;;AAEvB,kBAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;;AAEnD,kBAAM,CAAC,OAAO,CAAC,UAAA,KAAK,EAAI;AACpB,oBAAI,cAAc,GAAG,OAAK,eAAe,CAAC,KAAK,CAAC,CAAC;;;AAGjD,oBAAI,CAAC,QAAQ,IAAI,cAAc,EAAE;AAC7B,2BAAO,OAAK,eAAe,CAAC,KAAK,CAAC,CAAC;iBACtC,MAAM;AACH,wBAAI,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;;;AAG3E,wBAAI,aAAa,IAAI,CAAC,CAAC,EAAE;AACrB,sCAAc,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;qBAC3C;iBACJ;aACJ,CAAC,CAAC;;AAEH,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;;eAUM,iBAAC,KAAK,EACb;8CADkB,eAAe;AAAf,+BAAe;;;AAE7B,gBAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;;;;;AAKvD,gBAAI,WAAW,GAAG,IAAI,CAAC;;AAEvB,0BAAc,CAAC,OAAO,CAAC,UAAA,aAAa,EAAI;;;AAGpC,oBAAI,KAAK,GAAG,aAAa,kBAAI,eAAe,CAAC,CAAC;AAC9C,qBAAK,GAAG,KAAK,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;;AAEvC,2BAAW,GAAG,WAAW,IAAI,KAAK,CAAC;aACtC,CAAC,CAAC;;AAEH,mBAAO,WAAW,CAAC;SACtB;;;qBArFA,qBApBG,UAAU,EAoBF,KAAK,CAAC;;mBACA,EAAE;;;;;WARH,eAAe;;;qBAAf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BCbb,cAAc;;;;sBAClB,WAAW;;;;4BACV,qBAAqB;;+BAChB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+B5B,eAAe;;;;cAAf,eAAe;;0BAAf,eAAe;;qBAO/B,qBAtCG,UAAU,EAsCF,KAAK,CAAC;;mBACH,SAAS;;;;;;;;;;;qBAOvB,qBA9CG,UAAU,EA8CF,KAAK,CAAC;;mBACH,KAAK;;;;;;;;;;;qBAOnB,qBAtDG,UAAU,EAsDF,KAAK,CAAC;;mBACF,KAAK;;;;;;;;;;;qBAOpB,qBA9DG,UAAU,EA8DF,KAAK,CAAC;;mBACC,IAAI;;;;;;;;;;;qBAOtB,qBAtEG,UAAU,EAsEF,KAAK,CAAC;;mBACF,EAAE;;;;;;;;;;;qBAOjB,qBA9EG,UAAU,EA8EF,KAAK,CAAC;;mBACN,SAAS;;;;;;;;;;;qBAOpB,qBAtFG,UAAU,EAsFF,KAAK,CAAC;;mBACL,CAAC;;;;;;;;;;;qBAOb,qBA9FG,UAAU,EA8FF,KAAK,CAAC;;mBACJ,CAAC;;;;;;;;;;;qBAOd,qBAtGG,UAAU,EAsGF,KAAK,CAAC;;mBACP,KAAK;;;;;;;;;;;qBAOf,qBA9GG,UAAU,EA8GF,KAAK,CAAC;;mBACD,IAAI;;;;;;;;;;qBAMpB,qBArHG,UAAU,EAqHF,KAAK,CAAC;;mBACE,SAAS;;;;;;;;;;;;;;;qBAW5B,qBAjIG,UAAU,EAiIF,KAAK,CAAC;;mBACF;AACZ,qBAAK,EAAE,IAAI;AACX,wBAAQ,EAAE,IAAI;AACd,mBAAG,EAAE,IAAI;AACT,uBAAO,EAAE,IAAI;aAChB;;;;;AAEU,aA1GM,eAAe,CA0GpB,WAAW,EACvB;;;YADyB,QAAQ,yDAAG,EAAE;;8BA1GrB,eAAe;;AA4G5B,mBAAW,GAAG,AAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAI,WAAW,GAAG,UAAU,CAAC;;AAExF,mCA9Ga,eAAe,6CA8GtB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnB,YAAI,CAAC,sBAAsB,CAAC;AACxB,gBAAI,EAAE;;AAEF,oBAAI,EAAE,WAAW,IAAI,QAAQ,GAAI,CAAC,GAAG,IAAI,GAAG,IAAI,GAAK,EAAE,GAAG,IAAI,GAAG,IAAI,AAAC;AACtE,0BAAU,EAAE,CAAC;aAChB;SACJ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;;AAEtB,YAAI,CAAC,YAAY,GAAG,WAAW,CAAC;;;AAGhC,YAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE;mBAAM,oBAAO,IAAI,CAAC,MAAK,aAAa,CAAC,KAAK,CAAC;SAAA,CAAC,CAAC;AAC7E,YAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAA,GAAG,EAAI;AACnC,gBAAI,CAAC,MAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,IAAI,cAAc,CAAC,OAAO,EAAE;AAC5D,oCAAO,IAAI,CAAC,MAAK,aAAa,CAAC,KAAK,CAAC,CAAC;AACtC,sBAAK,QAAQ,GAAG,IAAI,CAAC;aACxB;SACJ,CAAC,CAAC;;AAEH,YAAI,YAAY,GAAG,AAAC,WAAW,IAAI,QAAQ,GAAI,YAAY,GAAG,KAAK,CAAC;;AAEpE,YAAI,CAAC,EAAE,CAAI,YAAY,gBAAa,UAAC,GAAG,EAAE,KAAK;mBAAK,MAAK,SAAS,CAAC,KAAK,CAAC;SAAA,CAAC,CAAC;AAC3E,YAAI,CAAC,EAAE,CAAI,YAAY,eAAY;mBAAM,MAAK,QAAQ,EAAE;SAAA,CAAC,CAAC;AAC1D,YAAI,CAAC,EAAE,CAAI,YAAY,eAAY;mBAAM,MAAK,IAAI,EAAE;SAAA,CAAC,CAAC;KACzD;;;;;;;;;0BAxIgB,eAAe;;eAgJ3B,iBACL;AACI,gBAAI,WAAW,GAAG,IAAI,CAAC,YAAY;gBAC/B,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI;gBACnC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;;AAE9B,gBAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,gBAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,gBAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,gBAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,gBAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,gBAAI,CAAC,iBAAiB,GAAG,kBA3LzB,KAAK,GA2L2B,CAAC;;;AAGjC,gBAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACrB,oBAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;aAC5C;;;AAGD,gBAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AAChC,kBAAM,CAAC,KAAK,GAAM,WAAW,SAAI,KAAK,WAAQ,CAAC;AAC/C,kBAAM,CAAC,QAAQ,GAAM,WAAW,SAAI,KAAK,cAAW,CAAC;AACrD,kBAAM,CAAC,GAAG,GAAM,WAAW,SAAI,KAAK,SAAM,CAAC;AAC3C,kBAAM,CAAC,OAAO,GAAM,WAAW,SAAI,KAAK,aAAU,CAAC;;;;;;AAMnD,gBAAI,IAAI,GAAG,AAAC,WAAW,IAAI,QAAQ,GAAI,IAAI,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;;AAE7F,gBAAI,IAAI,GAAG,AAAC,WAAW,IAAI,UAAU,GAAI,KAAK,GAAG,MAAM,CAAC;;;AAGxD,gBAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AACnB,oBAAI,EAAE,YAAY,CAAC,IAAI;aAC1B,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;;AAEtB,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQI,iBACL;AACI,gBAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,mBAAO,IAAI,CAAC,MAAM,EAAE,CAAC;SACxB;;;;;;;;;;;eASQ,mBAAC,KAAK,EACf;;;;AAEI,gBAAI,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;;AAG5D,gBAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;;AAE7B,gBAAI,MAAM,GAAG,IAAI,CAAC,aAAa;gBAC3B,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE;gBAC/B,SAAS,GAAM,MAAM,CAAC,QAAQ,SAAI,UAAU,AAAE;gBAC9C,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;AAE1B,gCAAO,IAAI,CAAC,SAAS,CAAC,CAAC;;;AAGvB,gBAAI,UAAU,GAAG,oBAAO,OAAO,CACpB,MAAM,CAAC,OAAO,aAAQ,UAAU,EACnC,MAAM,CAAC,KAAK,EACZ,SAAS,CACZ;gBACD,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;;AAE1C,gBAAI,YAAY,CAAC;;AAEjB,gBAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;;AAChC,4BAAY,GAAG,QAAQ,CAAC;aAC3B,MAAM;;AAEH,wBAAI,cAAc,GAAG,oBAAO,OAAO,CAC5B,MAAM,CAAC,OAAO,iBAAY,UAAU;;AAEpC,0BAAM,CAAC,QAAQ,UAAI,UAAU,GAAG,CAAC,CAAA,EACpC,SAAS,CACZ,CAAC;AACF,gCAAY,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAA,GAAI,cAAc,GAAG,IAAI,CAAC;iBAC3E;;;AAGD,gBAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;;;;AAI/B,gBAAI,CAAC,iBAAiB,GAAG,kBAvRzB,KAAK,EAuR0B,YAAM;AACjC,uBAAK,SAAS,GAAG,QAAQ,CAAC;AAC1B,uBAAK,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;;AAEtC,uBAAK,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;aACpD,CAAC,CAAC;;AAEH,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQO,oBACR;AACI,gBAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQG,gBACJ;;AAEI,gBAAI,IAAI,CAAC,YAAY,EAAE;AACnB,oBAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC3B,oBAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;aAC3D;;;iBAGI;AACD,wBAAI,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI;wBACnC,IAAI,GAAG,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC;;AAEvD,wBAAI,CAAC,QAAQ,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,EAAJ,IAAI,EAAC,EAAC,CAAC,CAAC;AAC9B,wBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;;AAE9B,wBAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,wBAAI,CAAC,KAAK,EAAE,CAAC;iBAChB;;AAED,mBAAO,IAAI,CAAC;SACf;;;WAxSgB,eAAe;;;qBAAf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCClCR,oBAAoB;;;;4BACG,qBAAqB;;+BAC/C,wBAAwB;;;;;;;;;;;;;;;;IAe5B,UAAU;;;;cAAV,UAAU;;0BAAV,UAAU;;qBAO1B,qBAtBG,UAAU,EAsBF,KAAK,CAAC;;mBACC,IAAI;;;;;;;;;;;qBAOtB,qBA9BG,UAAU,EA8BF,KAAK,CAAC;;mBACN,IAAI;;;;;;;;;;;qBAOf,qBAtCG,UAAU,EAsCF,KAAK,CAAC;;mBACJ,SAAS;;;;;;;;;;;qBAOtB,qBA9CG,UAAU,EA8CF,KAAK,CAAC;;mBACX,IAAI;;;;;;;;;;;qBAOV,qBAtDG,UAAU,EAsDF,KAAK,CAAC;;mBACF,IAAI;;;;;;;;;;;qBAOnB,qBA9DG,UAAU,EA8DF,KAAK,CAAC;;mBACJ,KAAK;;;;;;;;;;;qBAOlB,qBAtEG,UAAU,EAsEF,KAAK,CAAC;;mBACM,KAAK;;;;;AAElB,aA1DM,UAAU,CA0Df,UAAU,EACtB;;;YADwB,QAAQ,yDAAG,EAAE;;8BA1DpB,UAAU;;AA4DvB,mCA5Da,UAAU,6CA4Df;;;;;;;;;;;;;;;;AAER,YAAI,CAAC,sBAAsB,CAAC;AACxB,oBAAQ,EAAE,eAAe;AACzB,iBAAK,EAAE,IAAI;SACd,CAAC,CAAC;;AAEH,YAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;;AAExB,YAAI,CAAC,WAAW,GAAG,UAAU,CAAC;;;;AAI9B,YAAI,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,sBAAsB,CAAC,EAAE,YAAM;AACrD,gBAAI,CAAC,MAAK,qBAAqB,EAAE;AAC7B,sBAAK,WAAW,GAAG,IAAI,CAAC;aAC3B;SACJ,CAAC,CAAC;;AAEH,YAAI,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,oBAAoB,CAAC,EAAE,YAAM;AACjD,gBAAI,CAAC,MAAK,qBAAqB,EAAE;AAC7B,sBAAK,WAAW,GAAG,KAAK,CAAC;aAC5B;SACJ,CAAC,CAAC;KACN;;;;;;;;;;;;;;;;0BApFgB,UAAU;;eAmGnB,oBACR;gBADS,SAAQ,yDAAG,IAAI;;AAEpB,gBAAI,kBArHJ,QAAQ,EAqHK,SAAQ,CAAC,EAAE;AACpB,oBAAI,CAAC,SAAS,GAAG,kBAtHG,YAAY,EAsHF,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,SAAQ,CAAC,CAAC;AAC3F,uBAAO,IAAI,CAAC;aACf,MAAM;AACH,uBAAO,kBAzHD,IAAI,EAyHE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;aAC9D;SACJ;;;;;;;;;;eAQW,wBACZ;AACI,mBAAO,IAAI,CAAC,WAAW,CAAC;SAC3B;;;;;;;;;;;eASqB,gCAAC,QAAQ,EAC/B;AACI,gBAAI,CAAC,gBAAgB,GAAG,kBAjJR,MAAM,EAiJS,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AACtE,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;;eAUU,qBAAC,UAAU,EAAE,WAAW,EACnC;;;;;;AAII,gBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;AAC7D,uBAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;AACtF,uBAAO,IAAI,CAAC;aACf;;AAED,gBAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;gBAC1B,GAAG,GAAG,IAAI,cAAc,EAAE;gBAC1B,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;;;AAGvC,gBAAI,EAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AACxC,uBAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AACrD,uBAAO,IAAI,CAAC;aACf;;AAED,uBAAW,GAAG,WAAW,IAAI,EAAE,CAAC;;AAEhC,gBAAI,WAAW,GAAG,AAAC,IAAI,IAAI,EAAA,CAAE,OAAO,EAAE,CAAC;AACvC,gBAAI,CAAC,aAAa,gBAAc,WAAW,AAAE,CAAC;;;AAG9C,gBAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAC5B,eAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,eAAG,gBAAc,IAAI,CAAC,WAAW,AAAE,CAAC;;AAEpC,kBAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAA,KAAK,EAAI;AACtC,oBAAI,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,mBAAG,UAAQ,KAAK,SAAI,KAAK,AAAE,CAAC;aAC/B,CAAC,CAAC;;AAEH,eAAG,UAAQ,IAAI,CAAC,aAAa,AAAE,CAAC;;AAEhC,eAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;;;AAG1B,gBAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,MAAM,EAAE;AAC5D,oBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;aACrB;;;AAGD,gBAAI,CAAC,IAAI,GAAG,GAAG,CAAC;;;AAGhB,gBAAM,MAAM,GAAG,CACX,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAC9F,CAAC;;AAEF,kBAAM,CAAC,OAAO,CAAC,UAAA,SAAS,EAAI;AACxB,mBAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAa;sDAAT,IAAI;AAAJ,4BAAI;;;;AAEpC,wBAAI,SAAS,IAAI,UAAU,IAAI,CAAC,OAAK,WAAW,EAAE,OAAO;;AAEzD,2BAAK,OAAO,MAAA,mBAAQ,SAAS,EAAI,GAAG,SAAK,IAAI,EAAC,CAAC;iBAClD,CAAC,CAAC;;;AAGH,oBAAI,SAAS,IAAI,kBAAkB,EAAE;AACjC,uBAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAa;2DAAT,IAAI;AAAJ,gCAAI;;;AAC3C,+BAAK,OAAO,MAAA,0BAAe,SAAS,EAAI,GAAG,SAAK,IAAI,EAAC,CAAC;qBACzD,CAAC,CAAC;iBACN;aACJ,CAAC,CAAC;;;;;AAKH,gBAAM,YAAY,GAAG,SAAf,YAAY,CAAG,GAAG,EAAI;AACxB,0BAAU,CAAC,YAAM;AACb,wBAAI,GAAG,CAAC,UAAU,IAAI,cAAc,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,EAAE;AAClF,+BAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAC5B,+BAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;AACnC,2BAAG,CAAC,KAAK,EAAE,CAAA;qBACd;iBACJ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;aACtB,CAAC;;AAEF,gBAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,YAAY,CAAC,CACxC,EAAE,CAAC,sBAAsB,EAAE,CAAC,UAAA,cAAc,EAAI;AAC3C,uBAAO,UAAA,GAAG,EAAI;AACV,wBAAI,CAAC,cAAc,IAAI,GAAG,CAAC,UAAU,IAAI,cAAc,CAAC,OAAO,EAAE;AAC7D,sCAAc,GAAG,IAAI,CAAC;AACtB,oCAAY,CAAC,GAAG,CAAC,CAAC;qBACrB;iBACJ,CAAC;aACL,CAAA,CAAE,KAAK,CAAC,CAAC,CAAC;;AAEf,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;eASW,wBACZ;gBADa,IAAI,yDAAG,IAAI;;AAEpB,gBAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,MAAM,EAAE;AAC5D,oBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACxB,MAAM;AACH,uBAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;aAC7E;;AAED,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQK,kBACN;AACI,gBAAI,IAAI,CAAC,IAAI,EAAE;AACX,oBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;aACrB;;AAED,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;eASc,yBAAC,QAAQ,EACxB;;;AAGI,sBAAU,CAAC,CAAC,UAAA,YAAY,EAAI;AACxB,uBAAO,YAAM;;AAET,wBAAI,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,UAAS,KAAK,EAAE;AAC1E,+BAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC5C,CAAC,CAAC;;;;;;;;AAQH,4BAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;iBAChD,CAAC;aACL,CAAA,CAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;;AAE3B,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;eASa,wBAAC,YAAY,EAC3B;AACI,gBAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;AAClC,gBAAI,CAAC,WAAW,GAAG,YAAY,CAAC;AAChC,mBAAO,IAAI,CAAC;SACf;;;WAvTgB,UAAU;;;qBAAV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BCjBR,cAAc;;;;sBAClB,WAAW;;;;4BACe,qBAAqB;;+BACzC,wBAAwB;;;;;;;;;;;;;;;;IAe5B,aAAa;;;;cAAb,aAAa;;0BAAb,aAAa;;qBAO7B,qBAtBG,UAAU,EAsBF,KAAK,CAAC;;mBACF,SAAS;;;;;;;;;;;qBAOxB,qBA9BG,UAAU,EA8BF,KAAK,CAAC;;mBACF,SAAS;;;;;;;;;;;qBAOxB,qBAtCG,UAAU,EAsCF,KAAK,CAAC;;mBACL,SAAS;;;;;;;;;;;qBAOrB,qBA9CG,UAAU,EA8CF,KAAK,CAAC;;mBACL,CAAC;;;;;;;;;;;;;;qBAUb,qBAzDG,UAAU,EAyDF,KAAK,CAAC;;mBACF;AACZ,qBAAK,EAAE,IAAI;AACX,mBAAG,EAAE,IAAI;AACT,uBAAO,EAAE,IAAI;aAChB;;;;;AAEU,aAjDM,aAAa,GAkD9B;;;YADY,QAAQ,yDAAG,EAAE;;8BAjDR,aAAa;;AAmD1B,mCAnDa,aAAa,6CAmDpB,SAAS,EAAE;;;;;;;;;;;;AAEjB,YAAI,CAAC,sBAAsB,CAAC;AACxB,oBAAQ,EAAE,CAAC;AACX,oBAAQ,EAAE,CAAC;SACd,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;;;AAGtB,YAAI,oBAAO,sBAAsB,EAAE,EAAE;AACjC,gBAAI,CAAC,EAAE,CAAC,UAAU,EAAE;uBAAM,MAAK,QAAQ,EAAE;aAAA,CAAC,CAAC;SAC9C;;;aAGI;;AAED,oBAAI,CAAC,EAAE,CAAC,eAAe,EAAE;2BAAM,oBAAO,IAAI,CAAC,MAAK,aAAa,CAAC,KAAK,CAAC;iBAAA,CAAC,CAAC;;;AAGtE,oBAAI,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAA,GAAG;2BAAI,MAAK,QAAQ,CAAC,GAAG,CAAC;iBAAA,CAAC,CAAC;aAC9D;KACJ;;;;;;;;;;;;;;;;0BAvEgB,aAAa;;eAsFtB,oBACR;gBADS,SAAQ,yDAAG,IAAI;;AAEpB,gBAAI,kBAxGJ,QAAQ,EAwGK,SAAQ,CAAC,EAAE;AACpB,kDAzFS,aAAa,0CAyFA,kBAzGhB,YAAY,EAyGiB,SAAQ,EAAE;AACzC,yBAAK,EAAE,CAAC;iBACX,CAAC,EAAE;aACP,MAAM;AACH,2BAAO,kBA7Ga,MAAM,6BAgBjB,aAAa,2CA6FU,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC9C;SACJ;;;;;;;;;;eAQI,iBACL;;;;;6BAI+B,IAAI,CAAC,QAAQ,EAAE;;gBAArC,QAAQ,cAAR,QAAQ;gBAAE,QAAQ,cAAR,QAAQ;;AAEvB,gBAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;AAC9B,gBAAI,CAAC,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;;AAEzC,gBAAI,CAAC,oBAAO,sBAAsB,EAAE,EAAE;AAClC,oBAAI,CAAC,aAAa,EAAE,CAAC;AACrB,oBAAI,CAAC,aAAa,EAAE,CAAC;aACxB;;;AAGD,gBAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;;AAE1B,gBAAI,CAAC,UAAU,GAAG,EAAE,CAAC;AACrB,gBAAI,CAAC,YAAY,EAAE,CAAC;;AAEpB,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;eASW,wBACZ;;;gBADa,KAAK,yDAAG,KAAK;;AAEtB,gBAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAChC,gBAAI,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;;AAErE,gBAAI,IAAI,CAAC,aAAa,EAAE,KAAK,YAAY,IAAI,KAAK,CAAA,AAAC,EAAE;;AAEjD,oBAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AAChC,sBAAM,CAAC,KAAK,gBAAc,KAAK,WAAQ,CAAC;AACxC,sBAAM,CAAC,GAAG,gBAAc,KAAK,SAAM,CAAC;AACpC,sBAAM,CAAC,OAAO,gBAAc,KAAK,aAAU,CAAC;;;AAG5C,oBAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;aAC1C,MAAM;;AAEH,oBAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;;;;;AAK3B,0BAAU,CAAC;2BAAM,OAAK,IAAI,EAAE;iBAAA,EAAE,CAAC,CAAC,CAAC;aACpC;;AAED,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;eASO,oBACR;;;gBADS,GAAG,yDAAG,IAAI;;;AAGf,gBAAI,CAAC,GAAG,EAAE;AACN,oBAAI,CAAC,eAAe,CAAC,UAAA,KAAK,EAAI;;;AAG1B,wBAAI,OAAO,GAAG,CAAC,KAAK,CAAC,qBAAqB,GAChC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,YAAY,GACrC,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAAC;;AAE3D,wBAAI,OAAO,EAAE,OAAK,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,2BAAK,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;iBAC/B,CAAC,CAAC;aACN;;;iBAGI,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;;;AAGpD,wBAAI,GAAG,CAAC,UAAU,IAAI,cAAc,CAAC,gBAAgB,EAAE;AACnD,4BAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;;AAEhC,4CAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxB,4BAAI,OAAO,GAAG,oBAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;AAEvE,4BAAI,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;;AAG3C,4BAAI,CAAC,MAAM,EAAE,CAAC;AACd,4BAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;qBAC/B;iBAEJ;;;qBAGI;AACD,4BAAI,CAAC,YAAY,EAAE,CAAC;qBACvB;;AAED,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQG,gBACJ;AACI,gBAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;;;AAGhC,gBAAI,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC;uBAAK,CAAC,GAAG,CAAC;aAAA,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,CAAA,AAAC,CAAC;AAChF,sBAAU,GAAG,UAAU,IAAI,IAAI,CAAC;;;AAGhC,gBAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;iCAClB,IAAI,CAAC,QAAQ,EAAE;;oBAArC,QAAQ,cAAR,QAAQ;oBAAE,QAAQ,cAAR,QAAQ;;AAEvB,uBAAO,CAAC,IAAI,CAAC,CACT,oGAAoG,oEACpC,QAAQ,oBAAe,QAAQ,OAClG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAChB;;;AAGD,gBAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;;AAE3C,mBAAO,IAAI,CAAC;SACf;;;WA/OgB,aAAa;;;qBAAb,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;+BClBN,mBAAmB;;;;8BACxB,mBAAmB;;;;iCAChB,sBAAsB;;;;mCACpB,wBAAwB;;;;sBACjC,UAAU;;;;4BAC2B,kBAAkB;;+BACjD,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2BzB,OAAO;;;;0BAAP,OAAO;;qBAOvB,qBAlCG,UAAU,EAkCF,KAAK,CAAC;;mBACP,EAAE;;;;;;;;;;;qBAOZ,qBA1CG,UAAU,EA0CF,KAAK,CAAC;;mBACI,KAAK;;;;;;;;;;;qBAO1B,qBAlDG,UAAU,EAkDF,KAAK,CAAC;;mBACC,EAAE;;;;;;;;;;;;qBAQpB,qBA3DG,UAAU,EA2DF,KAAK,CAAC;eACW,kCAC7B;AACI,gBAAI,MAAM,GAAG,kBA/Db,eAAe,GA+De;gBAC1B,OAAO,GAAG,EAAC,eAAe,8BAAA,EAAE,UAAU,6BAAA,EAAE,aAAa,gCAAA,EAAE,eAAe,kCAAA,EAAE,MAAM,qBAAA,EAAC,CAAC;;AAEpF,kBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI,EAAI;AACjC,sBAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;aAChC,CAAC,CAAC;;AAEH,mBAAO,IAAI,CAAC;SACf;;;AAEU,aA7CM,OAAO,GA8CxB;YADY,QAAQ,yDAAG,EAAE;;8BA7CR,OAAO;;;;;;;;AA+CpB,YAAI,CAAC,eAAe,CAAC,SAAS,EAAE,UAAA,QAAQ;mBAAI,mCAAkB,QAAQ,CAAC;SAAA,CAAC,CACnE,eAAe,CAAC,QAAQ,EAAE,UAAA,QAAQ;mBAAI,qCAAoB,QAAQ,EAAE,QAAQ,CAAC;SAAA,CAAC,CAC9E,eAAe,CAAC,UAAU,EAAE,UAAA,QAAQ;mBAAI,qCAAoB,UAAU,EAAE,QAAQ,CAAC;SAAA,CAAC,CAAC;;AAExF,YAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC9C;;;;;;;;;;;;;;;;0BApDgB,OAAO;;eAmEhB,oBACR;;;gBADS,SAAQ,yDAAG,IAAI;;AAEpB,gBAAI,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAE7C,gBAAI,kBAnGa,QAAQ,EAmGZ,SAAQ,CAAC,EAAE;;;AAEpB,wBAAI,cAAc,GAAG,kBArGU,MAAM,EAqGT,SAAQ,EAAE,WAAW,CAAC,CAAC;;;AAGnD,wBAAI,aAAa,GAAG,kBAxGW,MAAM,EAwGV,SAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;AAGlE,6BAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,UAAC,QAAQ,EAAE,UAAU,EAAK;AACpD,+BAAO,kBA5GY,MAAM,EA4GX,QAAQ,sBAAI,UAAU,EAAG,cAAc,EAAE,CAAC;qBAC3D,EAAE,EAAE,CAAC,CAAC;;;AAGP,6BAAQ,GAAG,kBAhHY,MAAM,EAgHX,SAAQ,EAAE,aAAa,CAAC,CAAC;;;AAG3C,wBAAI,MAAK,mBAAmB,EAAE;AAC1B,8BAAM,CAAC,IAAI,CAAC,MAAK,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI,EAAI;AACvC,kCAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;yBAChD,CAAC,CAAC;qBACN;;;yBAGI;AACD,kCAAK,gBAAgB,GAAG,SAAQ,CAAC;yBACpC;;AAED;;sBAAY;;;;aACf,MAAM;AACH,uBAAO,WAAW,CAAC,MAAM,CAAC,UAAC,QAAQ,EAAE,UAAU,EAAK;AAChD,2BAAO,kBAjIY,MAAM,EAiIX,QAAQ,sBAAI,UAAU,EAAG,MAAK,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;iBACjF,EAAE,EAAE,CAAC,CAAC;aACV;SACJ;;;;;;;;;;eAQW,wBACZ;AACI,gBAAI,UAAU,GAAG,KAAK,CAAC;;AAEvB,iBAAK,IAAI,KAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC5B,oBAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAI,CAAC,EAAE;AACpC,8BAAU,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAI,CAAC,CAAC,YAAY,EAAE,CAAC;iBACjE;aACJ;;AAED,mBAAO,UAAU,CAAC;SACrB;;;;;;;;;;;;eAUc,yBAAC,IAAI,EAAE,cAAc,EACpC;;;;;;;;AAQI,gBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;AACrC,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;eAQW,wBACZ;;;AACI,gBAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;;AAE3B,sBAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAA,IAAI,EAAI;AACvC,2BAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAK,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,YAAM;AAC3F,+BAAO,CAAC,OAAK,YAAY,EAAE,CAAC;qBAC/B,CAAC,CAAC;;AAEH,2BAAK,IAAI,CAAC,GAAG,OAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACpC,CAAC,CAAC;;AAEH,oBAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACnC;;AAED,mBAAO,IAAI,CAAC;SACf;;;WAxKgB,OAAO;;;qBAAP,OAAO;;;;;;;;;;;;;;;;;;;;;;4BCjCE,kBAAkB;;+BACvB,qBAAqB;;;;;;;IAMxC,MAAM;;;;0BAAN,MAAM;;qBAUP,qBAhBG,UAAU,EAgBF,KAAK,CAAC;;mBACP,EAAE;;;;;;;;;;;qBAOZ,qBAxBG,UAAU,EAwBF,KAAK,CAAC;;mBACT,EAAE;;;;;;;;;;;qBAOV,qBAhCG,UAAU,EAgCF,KAAK,CAAC;;mBACN,EAAE;;;;;AAEH,aA7BT,MAAM,GA8BR;8BA9BE,MAAM;;;;;;;;AA+BJ,YAAM,MAAM,GAAG,kBAtCf,eAAe,GAsCiB,CAAC;;AAEjC,YAAI,CAAC,QAAQ,GAAG;AACZ,uBAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW;AACjC,sBAAU,EAAE,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI;AAClD,0BAAc,EAAE,MAAM,CAAC,WAAW,IACd,OAAO,WAAW,CAAC,gBAAgB,IAAI,UAAU,AAAC,IACnD,WAAW,CAAC,MAAM;SACxC,CAAC;KACL;;;;;;;;;;0BAxCC,MAAM;;eAiDJ,cAAC,KAAK,EACV;AACI,gBAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;gBACvB,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;;AAE1B,gBAAI,OAAO,CAAC,UAAU,EAAE;AACpB,2BAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC3B;;AAED,gBAAI,OAAO,CAAC,WAAW,EAAE;AACrB,qBAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;aACpC,MAAM;AACH,qBAAK,CAAC,KAAK,CAAC,GAAG,AAAC,IAAI,IAAI,EAAA,CAAE,OAAO,EAAE,CAAC;aACvC;;AAED,mBAAO,IAAI,CAAC;SACf;;;;;;;;;;;;;eAWM,iBAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAC5C;AACI,gBAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;gBACvB,KAAK,GAAG,IAAI,CAAC,MAAM;gBACnB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;;AAEhC,gBAAI,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,EAAE;AAC9C,oBAAM,wBAAwB,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;;AAEvE,oBAAI,OAAO,CAAC,UAAU,EAAE;AACpB,+BAAW,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC1D,wBAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;;;;AAIjE,4BAAQ,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,wBAAwB,CAAC;iBACxG,MAAM;AACH,4BAAQ,CAAC,YAAY,CAAC,GAAG,wBAAwB,CAAC;iBACrD;aACJ;;AAED,mBAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;SACjC;;;;;;;;;;eAQqB,kCACtB;AACI,mBAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;SACvC;;;WA7GC,MAAM;;;qBAiHG,IAAI,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QC1GX,UAAU,GAAV,UAAU;;AAAnB,SAAS,UAAU,CAAC,YAAY,EAAE;AACrC,SAAO,UAAS,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE;AACrC,cAAU,CAAC,UAAU,GAAG,YAAY,CAAC;AACrC,WAAO,UAAU,CAAC;GACrB,CAAC;CACL;;;;;;;;;;;;;;;;;;;QCZe,eAAe,GAAf,eAAe;QAqBf,QAAQ,GAAR,QAAQ;QAYR,IAAI,GAAJ,IAAI;QAsCJ,MAAM,GAAN,MAAM;QAaN,YAAY,GAAZ,YAAY;QAaZ,MAAM,GAAN,MAAM;QAgBN,KAAK,GAAL,KAAK;;;;AAjHd,SAAS,eAAe,GAAG;;AAE9B,QAAI,OAAO,IAAI,KAAK,WAAW,EAAE;AAC7B,eAAO,IAAI,CAAC;KACf;;AAED,QAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC/B,eAAO,MAAM,CAAC;KACjB;;;AAGD,WAAO,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;CACxC;;;;;;;;;;AASM,SAAS,QAAQ,CAAC,GAAG,EAC5B;AACI,WAAO,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,QAAQ,CAAC;CAC9E;;;;;;;;;;AASM,SAAS,IAAI,CAAC,KAAK,EAC1B;AACI,WAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;CAC5C;;;;;;;;;;;AAWD,SAAS,OAAO,CAAC,MAAM,EACvB;QADyB,MAAM,yDAAG,EAAE;;AAEhC,UAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;;sCAFe,OAAO;AAAP,eAAO;;;AAI5C,WAAO,CAAC,OAAO,CAAC,UAAA,MAAM,EAAI;AACtB,cAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG,EAAI;AAC/B,gBAAI,CAAC,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;AACvC,oBAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACxB,sBAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;aAC/E;SACJ,CAAC,CAAA;KACL,CAAC,CAAC;;AAEH,WAAO,MAAM,CAAC;CACjB;;;;;;;;;;;AAUM,SAAS,MAAM,GACtB;QADuB,MAAM,yDAAG,EAAE;;uCAAK,OAAO;AAAP,eAAO;;;AAE1C,WAAO,OAAO,mBAAC,KAAK,EAAE,MAAM,SAAK,OAAO,EAAC,CAAC;CAC7C;;;;;;;;;;;AAUM,SAAS,YAAY,GAC5B;QAD6B,MAAM,yDAAG,EAAE;;uCAAK,OAAO;AAAP,eAAO;;;AAEhD,WAAO,OAAO,mBAAC,IAAI,EAAE,MAAM,SAAK,OAAO,EAAC,CAAC;CAC5C;;;;;;;;;;;AAUM,SAAS,MAAM,CAAC,GAAG,EAAE,UAAU,EACtC;AACI,QAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;AAExB,cAAU,CAAC,OAAO,CAAC,UAAA,KAAK;eAAI,OAAO,OAAO,CAAC,KAAK,CAAC;KAAA,CAAC,CAAC;;AAEnD,WAAO,OAAO,CAAC;CAClB;;;;;;;;;;AASM,SAAS,KAAK,GACrB;QADsB,IAAI,yDAAG,YAAM,EAAE;;;;;;AAMjC,WAAO;AACQ,0BACX;;;AACI,gBAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SACpB;;;;;;;;;;mBAOE,eACH;AACI,oBAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,uBAAO,IAAI,CAAC,IAAI,CAAC;aACpB;;;;WACJ,CAAC;CACL",
  "file": "generated.js",
  "sourceRoot": "",
  "sourcesContent": [
    "(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})",
    "import {enumerable} from '../utils/decorators';\n\n/**\n * A callback used as an event handler.\n * @public\n * @callback EventDispatcher~eventHandler\n * @param {...*} args The extra parameters provided to the `trigger` method.\n * @returns {?boolean} If `false` is explicitly returned, the `trigger` method will return `false`.\n */\n\n/**\n * @class EventDispatcher\n */\nexport default class EventDispatcher {\n\n    /**\n     * All the registered event callbacks, organized by events.\n     * @private\n     * @member {Object} EventDispatcher#_eventCallbacks\n     */\n    @enumerable(false)\n    _eventCallbacks = {};\n\n    /**\n     * Attach a callback to one or more events.\n     * @public\n     * @method EventDispatcher#on\n     * @param {string|string[]} events One or multiple event names.\n     * @param {EventDispatcher~eventHandler} callback An event handler.\n     * @returns {EventDispatcher}\n     */\n    on(events, callback)\n    {\n        events = Array.isArray(events) ? events : [events];\n\n        events.forEach(event => {\n            var eventCallbacks = this._eventCallbacks[event] = this._eventCallbacks[event] || [];\n\n            // If the callback isn't already registered, store it.\n            if (!~eventCallbacks.indexOf(callback)) {\n                eventCallbacks.push(callback);\n            }\n        });\n\n        return this;\n    }\n\n    /**\n     * Detach a callback from one or more events.\n     * @public\n     * @method EventDispatcher#off\n     * @param {string|string[]} events One or multiple event names.\n     * @param {EventDispatcher~eventHandler} callback An event handler.\n     * @returns {EventDispatcher}\n     */\n    off(events, callback = null)\n    {\n        events = Array.isArray(events) ? events : [events];\n\n        events.forEach(event => {\n            var eventCallbacks = this._eventCallbacks[event];\n\n            // If there is no specified callback, simply delete all the callbacks binded to the provided event.\n            if (!callback && eventCallbacks) {\n                delete this._eventCallbacks[event];\n            } else {\n                var callbackIndex = eventCallbacks ? eventCallbacks.indexOf(callback) : -1;\n\n                // If the callback is registered, remove it from the array.\n                if (callbackIndex != -1) {\n                    eventCallbacks.splice(callbackIndex, 1);\n                }\n            }\n        });\n\n        return this;\n    }\n\n    /**\n     * Trigger an event.\n     * @public\n     * @method EventDispatcher#trigger\n     * @param {string} event An event name.\n     * @param {...*} extraParameters Some extra parameters to pass to the event handlers.\n     * @returns {boolean} Returns `false` if one of the event handlers explicitly returned `false`.\n     */\n    trigger(event, ...extraParameters)\n    {\n        var eventCallbacks = this._eventCallbacks[event] || [];\n\n        // A callback can return a boolean value which will be logically compared to the other callbacks values before\n        // being returned by the trigger() method. This allows a callback to send a \"signal\" to the caller, like\n        // cancelling an action.\n        var returnValue = true;\n\n        eventCallbacks.forEach(eventCallback => {\n            // A callback must explicitly return false if it wants the trigger() method to return false, undefined will\n            // not work. This avoids crappy callbacks to mess up with the triggering system.\n            var value = eventCallback(...extraParameters);\n            value = value !== false ? true : false;\n\n            returnValue = returnValue && value; // Compare the result of the callback to the actual return value\n        });\n\n        return returnValue;\n    }\n\n}\n",
    "import HttpModule from './HttpModule';\nimport Timing from '../Timing';\nimport {defer} from '../../utils/helpers';\nimport {enumerable} from '../../utils/decorators';\n\n/**\n * @public\n * @typedef {Object} BandwidthModule~settingsObject\n * @extends HttpModule~settingsObject\n * @property {Object} data\n * @property {number} data.size The amount of data to initially use.\n * @property {number} [data.multiplier=2] If the measure period can't reach the delay defined in the settings, the data amount is multiplied by the following value.\n */\n\n/**\n * Apply a new set of custom settings.\n * @public\n * @method BandwidthModule#settings\n * @param {BandwidthModule~settingsObject} settings A set of custom settings.\n * @returns {BandwidthModule}\n */\n/**\n * Return the current set of settings.\n * @public\n * @method BandwidthModule#settings^2\n * @returns {BandwidthModule~settingsObject}\n */\n\n/**\n * @class BandwidthModule\n * @extends HttpModule\n * @param {string} loadingType The loading type, `upload` or `download`.\n * @param {BandwidthModule~settingsObject} [settings={}] A set of custom settings.\n */\nexport default class BandwidthModule extends HttpModule {\n\n    /**\n     *\n     * @private\n     * @member {string} BandwidthModule#_loadingType\n     */\n    @enumerable(false)\n    _loadingType = undefined;\n\n    /**\n     *\n     * @private\n     * @member {boolean} BandwidthModule#_intendedEnd\n     */\n    @enumerable(false)\n    _intendedEnd = false;\n\n    /**\n     *\n     * @private\n     * @member {boolean} BandwidthModule#_isRestarting\n     */\n    @enumerable(false)\n    _isRestarting = false;\n\n    /**\n     * Tracks the value of the `loaded` property for each progress event.\n     * @private\n     * @member {?number} BandwidthModule#_lastLoadedValue\n     */\n    @enumerable(false)\n    _lastLoadedValue = null;\n\n    /**\n     * The recorded measures of speed.\n     * @private\n     * @member {number[]} BandwidthModule#_speedRecords\n     */\n    @enumerable(false)\n    _speedRecords = [];\n\n    /**\n     * The average speed.\n     * @private\n     * @member {number} BandwidthModule#_avgSpeed\n     */\n    @enumerable(false)\n    _avgSpeed = undefined;\n\n    /**\n     * The ID of the current request.\n     * @private\n     * @member {number} BandwidthModule#_requestID\n     */\n    @enumerable(false)\n    _requestID = 0;\n\n    /**\n     * The ID of the current progress event.\n     * @private\n     * @member {number} BandwidthModule#_progressID\n     */\n    @enumerable(false)\n    _progressID = 0;\n\n    /**\n     * Defines if measures have started.\n     * @private\n     * @member {boolean} BandwidthModule#_started\n     */\n    @enumerable(false)\n    _started = false;\n\n    /**\n     * Defines if the current progress event is the first one triggered for the current request.\n     * @private\n     * @member {boolean} BandwidthModule#_firstProgress\n     */\n    @enumerable(false)\n    _firstProgress = true;\n\n    /**\n     * @private\n     * @member {Defer} BandwidthModule#_deferredProgress\n     */\n    @enumerable(false)\n    _deferredProgress = undefined;\n\n    /**\n     * Unique labels for each request, exclusively used to make measures.\n     * @private\n     * @member {Object} BandwidthModule#_timingLabels\n     * @property {?string} start\n     * @property {?string} progress\n     * @property {?string} end\n     * @property {?string} measure\n     */\n    @enumerable(false)\n    _timingLabels = {\n        start: null,\n        progress: null,\n        end: null,\n        measure: null\n    };\n\n    constructor(loadingType, settings = {})\n    {\n        loadingType = (~['upload', 'download'].indexOf(loadingType)) ? loadingType : 'download';\n\n        super(loadingType);\n\n        this._extendDefaultSettings({\n            data: {\n                // 2 MB for upload, 10 MB for download\n                size: loadingType == 'upload' ? (2 * 1024 * 1024) : (10 * 1024 * 1024),\n                multiplier: 2\n            }\n        }).settings(settings);\n\n        this._loadingType = loadingType;\n\n        // Bind to XHR events\n        this.on('xhr-upload-loadstart', () => Timing.mark(this._timingLabels.start));\n        this.on('xhr-readystatechange', xhr => {\n            if (!this._started && xhr.readyState == XMLHttpRequest.LOADING) {\n                Timing.mark(this._timingLabels.start);\n                this._started = true;\n            }\n        });\n\n        var eventsPrefix = (loadingType == 'upload') ? 'xhr-upload' : 'xhr';\n\n        this.on(`${eventsPrefix}-progress`, (xhr, event) => this._progress(event));\n        this.on(`${eventsPrefix}-timeout`, () => this._timeout());\n        this.on(`${eventsPrefix}-loadend`, () => this._end());\n    }\n\n    /**\n     * Start requesting the server to make measures.\n     * @public\n     * @method BandwidthModule#start\n     * @returns {BandwidthModule}\n     */\n    start()\n    {\n        var loadingType = this._loadingType,\n            dataSettings = this.settings().data,\n            reqID = this._requestID++;\n\n        this._intendedEnd = false;\n        this._lastLoadedValue = null;\n        this._speedRecords = [];\n        this._started = false;\n        this._firstProgress = true;\n        this._deferredProgress = defer();\n\n        // Trigger the start event\n        if (!this._isRestarting) {\n            this.trigger('start', dataSettings.size);\n        }\n\n        // Create unique timing labels for the new request\n        var labels = this._timingLabels;\n        labels.start = `${loadingType}-${reqID}-start`;\n        labels.progress = `${loadingType}-${reqID}-progress`;\n        labels.end = `${loadingType}-${reqID}-end`;\n        labels.measure = `${loadingType}-${reqID}-measure`;\n\n        // Generate some random data to upload to the server. Here we're using a Blob instead of an ArrayBuffer because\n        // of a bug in Chrome (tested in v33.0.1750.146), causing a freeze of the page while trying to directly upload\n        // an ArrayBuffer (through an ArrayBufferView). The freeze lasts nearly 4.5s for 10MB of data. Using a Blob\n        // seems to solve the problem.\n        var blob = (loadingType == 'upload') ? new Blob([new ArrayBuffer(dataSettings.size)]) : null;\n\n        var type = (loadingType == 'download') ? 'GET' : 'POST';\n\n        // Initiate and send a new request\n        this._newRequest(type, {\n            size: dataSettings.size\n        })._sendRequest(blob);\n\n        return this;\n    }\n\n    /**\n     * Abort the measures.\n     * @public\n     * @method BandwidthModule#abort\n     * @returns {BandwidthModule}\n     */\n    abort()\n    {\n        this._intendedEnd = true;\n        return this._abort();\n    }\n\n    /**\n     * Make bandwidth measures for the current request.\n     * @private\n     * @method BandwidthModule#_progress\n     * @param {ProgressEvent} event The event associated with the progress event of the current request.\n     * @returns {BandwidthModule}\n     */\n    _progress(event)\n    {\n        // Ignore the first progress event, it generally contributes to get incoherent values.\n        if (this._firstProgress) return this._firstProgress = false;\n\n        // Execute the previous progress trigger\n        this._deferredProgress.run();\n\n        var labels = this._timingLabels,\n            progressID = this._progressID++,\n            markLabel = `${labels.progress}-${progressID}`,\n            loaded = event.loaded;\n\n        Timing.mark(markLabel);\n\n        // Measure the average speed (B/s) since the request started\n        var avgMeasure = Timing.measure(\n                `${labels.measure}-avg-${progressID}`,\n                labels.start,\n                markLabel\n            ),\n            avgSpeed = loaded / avgMeasure * 1000;\n\n        var instantSpeed;\n\n        if (this._lastLoadedValue === null) { // We are executing the first progress event of the current request\n            instantSpeed = avgSpeed; // The instant speed of the first progress event is equal to the average one\n        } else {\n            // Measure the instant speed (B/s), which defines the speed between two progress events.\n            var instantMeasure = Timing.measure(\n                `${labels.measure}-instant-${progressID}`,\n                // Set the mark of the previous progress event as the starting point\n                `${labels.progress}-${progressID - 1}`,\n                markLabel\n            );\n            instantSpeed = (loaded - this._lastLoadedValue) / instantMeasure * 1000;\n        }\n\n        // Save the `loaded` property of the event for the next progress event\n        this._lastLoadedValue = loaded;\n\n        // Defer measures saving and event triggering, this allows to cancel the last progress event, which can generate\n        // incoherent values.\n        this._deferredProgress = defer(() => {\n            this._avgSpeed = avgSpeed;\n            this._speedRecords.push(instantSpeed);\n\n            this.trigger('progress', avgSpeed, instantSpeed);\n        });\n\n        return this;\n    }\n\n    /**\n     * Mark the current request as entirely finished (this means it ended after a time out).\n     * @private\n     * @method BandwidthModule#_timeout\n     * @returns {BandwidthModule}\n     */\n    _timeout()\n    {\n        this._intendedEnd = true;\n        return this;\n    }\n\n    /**\n     * End the measures.\n     * @private\n     * @method BandwidthModule#_end\n     * @returns {BandwidthModule}\n     */\n    _end()\n    {\n        // A timeout or an abort occured, bypass the further requests and trigger the \"end\" event.\n        if (this._intendedEnd) {\n            this._isRestarting = false;\n            this.trigger('end', this._avgSpeed, this._speedRecords);\n        }\n\n        // The request ended to early, restart it with an increased data size.\n        else {\n            var dataSettings = this.settings().data,\n                size = dataSettings.size * dataSettings.multiplier;\n\n            this.settings({data: {size}});\n            this.trigger('restart', size);\n\n            this._isRestarting = true;\n            this.start();\n        }\n\n        return this;\n    }\n\n\n}\n",
    "import EventDispatcher from '../EventDispatcher';\nimport {isObject, copy, assign, assignStrict} from '../../utils/helpers';\nimport {enumerable} from '../../utils/decorators';\n\n/**\n * @public\n * @typedef {Object} HttpModule~settingsObject\n * @property {string} [endpoint=./network.php] Where is located your `network.php` file.\n * @property {number} [delay=8000] The delay while you want to take measures.\n */\n\n/**\n * @class HttpModule\n * @extends EventDispatcher\n * @param {string} moduleName The name of the instanciated module.\n * @param {HttpModule~settingsObject} [settings={}] A set of custom settings.\n */\nexport default class HttpModule extends EventDispatcher {\n\n    /**\n     * The default settings.\n     * @private\n     * @member {?Object} HttpModule#_defaultSettings\n     */\n    @enumerable(false)\n    _defaultSettings = null;\n\n    /**\n     * The current settings.\n     * @private\n     * @member {?Object} HttpModule#_settings\n     */\n    @enumerable(false)\n    _settings = null;\n\n    /**\n     * The module name, will be send to the server.\n     * @private\n     * @member {string} HttpModule#_moduleName\n     */\n    @enumerable(false)\n    _moduleName = undefined;\n\n    /**\n     * The current XMLHttpRequest object.\n     * @private\n     * @member {?XMLHttpRequest} HttpModule#_xhr\n     */\n    @enumerable(false)\n    _xhr = null;\n\n    /**\n     * An URL token to avoid any caching issues. Also allows to identify the request in the Resource Timing entries.\n     * @private\n     * @member {?string} HttpModule#_lastURLToken\n     */\n    @enumerable(false)\n    _lastURLToken = null;\n\n    /**\n     * Defines if the module is currently running an HTTP request.\n     * @private\n     * @member {boolean} HttpModule#_requesting\n     */\n    @enumerable(false)\n    _requesting = false;\n\n    /**\n     * Defines if the requesting status has been overridden by the `_setRequesting` method.\n     * @private\n     * @member {boolean} HttpModule#_requestingOverridden\n     */\n    @enumerable(false)\n    _requestingOverridden = false;\n\n    constructor(moduleName, settings = {})\n    {\n        super();\n\n        this._extendDefaultSettings({\n            endpoint: './network.php',\n            delay: 8000\n        });\n\n        this.settings(settings);\n\n        this._moduleName = moduleName;\n\n        // Each time a request starts or ends, set the requesting value unless it has been overridden with the\n        // _setRequesting() method.\n        this.on(['xhr-loadstart', 'xhr-upload-loadstart'], () => {\n            if (!this._requestingOverridden) {\n                this._requesting = true;\n            }\n        });\n\n        this.on(['xhr-loadend', 'xhr-upload-loadend'], () => {\n            if (!this._requestingOverridden) {\n                this._requesting = false;\n            }\n        });\n    }\n\n    /**\n     * Apply a new set of custom settings.\n     * @public\n     * @method HttpModule#settings\n     * @param {HttpModule~settingsObject} settings A set of custom settings.\n     * @returns {HttpModule}\n     */\n    /**\n     * Return the current set of settings.\n     * @public\n     * @method HttpModule#settings^2\n     * @returns {HttpModule~settingsObject}\n     */\n    settings(settings = null)\n    {\n        if (isObject(settings)) {\n            this._settings = assignStrict(this._defaultSettings || {}, this._settings || {}, settings);\n            return this;\n        } else {\n            return copy(this._settings || this._defaultSettings || {});\n        }\n    }\n\n    /**\n     * Return if the module is currently making a request.\n     * @public\n     * @method HttpModule#isRequesting\n     * @returns {boolean} `true` if the module is requesting, otherwise `false`.\n     */\n    isRequesting()\n    {\n        return this._requesting;\n    }\n\n    /**\n     * Extend the set of default settings.\n     * @protected\n     * @method HttpModule#_extendDefaultSettings\n     * @param {Object} settings The new properties to add to the default settings.\n     * @returns {HttpModule}\n     */\n    _extendDefaultSettings(settings)\n    {\n        this._defaultSettings = assign(this._defaultSettings || {}, settings);\n        return this;\n    }\n\n    /**\n     * Create a new XHR request.\n     * @protected\n     * @method HttpModule#_newRequest\n     * @param {string} httpMethod The HTTP method to use with the request, GET or POST.\n     * @param {Object} queryParams The query parameters to use with the request.\n     * @returns {HttpModule}\n     */\n    _newRequest(httpMethod, queryParams)\n    {\n        // Check if a callback binded to the \"_newRequest\" event returns false, if it's the case, cancel the request\n        // creation. If the requesting status has been overridden, there's no need to cancel the request since the user\n        // should know what he's doing.\n        if (!this.trigger('_newRequest') && !this._requestingOverridden) {\n            console.warn('To ensure accurate measures, you can only make one request at a time.');\n            return this;\n        }\n\n        let settings = this.settings(),\n            xhr = new XMLHttpRequest(),\n            validHttpMethods = ['GET', 'POST'];\n\n        // Prepare the new request.\n        if (!~validHttpMethods.indexOf(httpMethod)) {\n            console.warn('The HTTP method must be GET or POST.');\n            return this;\n        }\n\n        queryParams = queryParams || {};\n\n        let tokenSuffix = (new Date).getTime();\n        this._lastURLToken = `network-${tokenSuffix}`;\n\n        // Append the query parameters\n        let url = settings.endpoint;\n        url += ~url.indexOf('?') ? '&' : '?';\n        url += `module=${this._moduleName}`;\n\n        Object.keys(queryParams).forEach(param => {\n            let value = encodeURIComponent(queryParams[param]);\n            url += `&${param}=${value}`;\n        });\n\n        url += `&${this._lastURLToken}`;\n\n        xhr.open(httpMethod, url);\n\n        // Abort the previous request if it hasn't been sent\n        if (this._xhr && this._xhr.readyState == XMLHttpRequest.OPENED) {\n            this._xhr.abort();\n        }\n\n        // Replace the old request by the new one\n        this._xhr = xhr;\n\n        // Bind all the XHR events\n        const events = [\n            'loadstart', 'progress', 'abort', 'error', 'load', 'timeout', 'loadend', 'readystatechange'\n        ];\n\n        events.forEach(eventType => {\n            xhr.addEventListener(eventType, (...args) => {\n                // A last progress event can be triggered once a request has timed out, ignore it.\n                if (eventType == 'progress' && !this._requesting) return;\n\n                this.trigger(`xhr-${eventType}`, xhr, ...args);\n            });\n\n            // The XMLHttpRequestUpload interface supports all the above event types except the \"readystatechange\" one\n            if (eventType != 'readystatechange') {\n                xhr.upload.addEventListener(eventType, (...args) => {\n                    this.trigger(`xhr-upload-${eventType}`, xhr, ...args);\n                });\n            }\n        });\n\n        // Define the timeout of the request. We don't use the native `timeout` property since it can distort the\n        // measures.\n        // See: https://github.com/nesk/network.js/issues/26\n        const startTimeout = xhr => {\n            setTimeout(() => {\n                if (xhr.readyState != XMLHttpRequest.UNSENT && xhr.readyState != XMLHttpRequest.DONE) {\n                    this.trigger('xhr-timeout');\n                    this.trigger('xhr-upload-timeout');\n                    xhr.abort()\n                }\n            }, settings.delay);\n        };\n\n        this.on('xhr-upload-loadstart', startTimeout)\n            .on('xhr-readystatechange', (timeoutStarted => {\n                return xhr => {\n                    if (!timeoutStarted && xhr.readyState == XMLHttpRequest.LOADING) {\n                        timeoutStarted = true;\n                        startTimeout(xhr);\n                    }\n                };\n            })(false));\n\n        return this;\n    }\n\n    /**\n     * Send a newly created XHR request.\n     * @protected\n     * @method HttpModule#_sendRequest\n     * @param {?*} [data=null] The data to send with the request.\n     * @returns {HttpModule}\n     */\n    _sendRequest(data = null)\n    {\n        if (this._xhr && this._xhr.readyState == XMLHttpRequest.OPENED) {\n            this._xhr.send(data);\n        } else {\n            console.warn('A request must have been created before sending any data.');\n        }\n\n        return this;\n    }\n\n    /**\n     * Abort the current request.\n     * @protected\n     * @method HttpModule#_abort\n     * @returns {HttpModule}\n     */\n    _abort()\n    {\n        if (this._xhr) {\n            this._xhr.abort();\n        }\n\n        return this;\n    }\n\n    /**\n     * Get the Resource Timing entry associated to the current request.\n     * @protected\n     * @method HttpModule#_getTimingEntry\n     * @param {HttpModule~timingCallback} callback A callback used to send back the timing entry.\n     * @returns {HttpModule}\n     */\n    _getTimingEntry(callback)\n    {\n        // The Resource Timing entries aren't immediately available once the 'load' event is triggered by an\n        // XMLHttpRequest, we must wait for another process tick to check for a refreshed list.\n        setTimeout((lastURLToken => {\n            return () => {\n                // Filter the timing entries to return only the one concerned by the last request made\n                let entries = performance.getEntriesByType('resource').filter(function(entry) {\n                    return ~entry.name.indexOf(lastURLToken);\n                });\n\n                /**\n                 * A callback used to send back the timing entry.\n                 * @private\n                 * @callback HttpModule~timingCallback\n                 * @param {PerformanceResourceTiming} entry The Resource Timing entry associated to the current request.\n                 */\n                callback(entries.length ? entries[0] : null);\n            };\n        })(this._lastURLToken), 0);\n\n        return this;\n    }\n\n    /**\n     * Override the requesting status of the module.\n     * @protected\n     * @method HttpModule#_setRequesting\n     * @param {boolean} isRequesting The requesting status.\n     * @returns {HttpModule}\n     */\n    _setRequesting(isRequesting)\n    {\n        this._requestingOverridden = true;\n        this._requesting = isRequesting;\n        return this;\n    }\n\n}\n",
    "import HttpModule from './HttpModule';\nimport Timing from '../Timing';\nimport {isObject, assignStrict, except} from '../../utils/helpers';\nimport {enumerable} from '../../utils/decorators';\n\n/**\n * @public\n * @typedef {Object} LatencyModule~settingsObject\n * @property {string} [endpoint=./network.php] Where is located your `network.php` file.\n * @property {number} [measures=5] How many measures should be returned.\n * @property {number} [attempts=3] How much attempts to get a valid value should be done for each measure.\n */\n\n/**\n * @class LatencyModule\n * @extends HttpModule\n * @param {LatencyModule~settingsObject} [settings={}] A set of custom settings.\n */\nexport default class LatencyModule extends HttpModule {\n\n    /**\n     * The total number of requests left.\n     * @private\n     * @member {number} LatencyModule#_requestsLeft\n     */\n    @enumerable(false)\n    _requestsLeft = undefined;\n\n    /**\n     * The total number of attempts left.\n     * @private\n     * @member {number} LatencyModule#_attemptsLeft\n     */\n    @enumerable(false)\n    _attemptsLeft = undefined;\n\n    /**\n     * The measured latencies.\n     * @private\n     * @member {number[]} LatencyModule#_latencies\n     */\n    @enumerable(false)\n    _latencies = undefined;\n\n    /**\n     * The ID of the current request.\n     * @private\n     * @member {number} LatencyModule#_requestID\n     */\n    @enumerable(false)\n    _requestID = 0;\n\n    /**\n     * Unique labels for each request, exclusively used to make measures.\n     * @private\n     * @member {Object} LatencyModule#_requestID\n     * @property {?string} start\n     * @property {?string} end\n     * @property {?string} measure\n     */\n    @enumerable(false)\n    _timingLabels = {\n        start: null,\n        end: null,\n        measure: null\n    };\n\n    constructor(settings = {})\n    {\n        super('latency');\n\n        this._extendDefaultSettings({\n            measures: 5,\n            attempts: 3\n        }).settings(settings);\n\n        // Measure the latency with the Resource Timing API once the request is finished\n        if (Timing.supportsResourceTiming()) {\n            this.on('xhr-load', () => this._measure());\n        }\n\n        // If the browser doesn't support the Resource Timing API, we fallback on a Datetime solution.\n        else {\n            // Set a mark when the request starts\n            this.on('xhr-loadstart', () => Timing.mark(this._timingLabels.start));\n\n            // Then make a measure with the previous mark\n            this.on('xhr-readystatechange', xhr => this._measure(xhr));\n        }\n    }\n\n    /**\n     * Apply a new set of custom settings.\n     * @public\n     * @method LatencyModule#settings\n     * @param {LatencyModule~settingsObject} settings A set of custom settings.\n     * @returns {LatencyModule}\n     */\n    /**\n     * Return the current set of settings.\n     * @public\n     * @method LatencyModule#settings^2\n     * @returns {LatencyModule~settingsObject}\n     */\n    settings(settings = null)\n    {\n        if (isObject(settings)) {\n            return super.settings(assignStrict(settings, {\n                delay: 0 // We dont want any timeout during a latency calculation\n            }));\n        } else {\n            return except(super.settings(), ['delay']);\n        }\n    }\n\n    /**\n     * Start requesting the server to make measures.\n     * @public\n     * @method LatencyModule#start\n     * @returns {LatencyModule}\n     */\n    start()\n    {\n        // Set the number of requests required to establish the network latency. If the browser doesn't support the\n        // Resource Timing API, add a request that will be ignored to avoid a longer request due to a possible\n        // DNS/whatever fetch.\n        let {measures, attempts} = this.settings();\n\n        this._requestsLeft = measures;\n        this._attemptsLeft = attempts * measures;\n\n        if (!Timing.supportsResourceTiming()) {\n            this._requestsLeft++;\n            this._attemptsLeft++;\n        }\n\n        // Override the requesting value since a complete latency request consists off multiple ones\n        this._setRequesting(true);\n\n        this._latencies = [];\n        this._nextRequest();\n\n        return this;\n    }\n\n    /**\n     * Initiate the next request used for latency measures.\n     * @private\n     * @method LatencyModule#_nextRequest\n     * @param {boolean} [retry=false] Defines if the next request is a retry due to a failing request or not.\n     * @returns {LatencyModule}\n     */\n    _nextRequest(retry = false)\n    {\n        const reqID = this._requestID++;\n        let requestsLeft = retry ? this._requestsLeft : this._requestsLeft--;\n\n        if (this._attemptsLeft-- && (requestsLeft || retry)) {\n            // Create unique timing labels for the new request\n            var labels = this._timingLabels;\n            labels.start = `latency-${reqID}-start`;\n            labels.end = `latency-${reqID}-end`;\n            labels.measure = `latency-${reqID}-measure`;\n\n            // Create the new request and send it\n            this._newRequest('GET')._sendRequest();\n        } else {\n            // All the requests are finished, set the requesting status to false.\n            this._setRequesting(false);\n\n            // If all the requests have been executed, calculate the average latency. Since the _getTimingEntry() method\n            // is asynchronous, wait for the next process tick to execute the _end() method, to be sure that all the\n            // latencies have been retrieved.\n            setTimeout(() => this._end(), 0);\n        }\n\n        return this;\n    }\n\n    /**\n     * Make latency measures for the last request.\n     * @private\n     * @method LatencyModule#_measure\n     * @param {?XMLHttpRequest} [xhr=null] The concerned XMLHttpRequest if the browser doesn't support the Resource Timing API.\n     * @returns {LatencyModule}\n     */\n    _measure(xhr = null)\n    {\n        // With Resource Timing API\n        if (!xhr) {\n            this._getTimingEntry(entry => {\n                // The latency calculation differs between an HTTP and an HTTPS connection\n                // See: http://www.w3.org/TR/resource-timing/#processing-model\n                let latency = !entry.secureConnectionStart\n                        ? entry.connectEnd - entry.connectStart\n                        : entry.secureConnectionStart - entry.connectStart;\n\n                if (latency) this._latencies.push(latency);\n                this._nextRequest(!latency);\n            });\n        }\n\n        // Without Resource Timing API\n        else if (this._requestsLeft < this.settings().measures) {\n\n            // Measure and save the latency if the headers have been received\n            if (xhr.readyState == XMLHttpRequest.HEADERS_RECEIVED) {\n                let labels = this._timingLabels;\n\n                Timing.mark(labels.end);\n                let latency = Timing.measure(labels.measure, labels.start, labels.end);\n\n                if (latency) this._latencies.push(latency);\n\n                // Abort the current request before we run a new one\n                this._abort();\n                this._nextRequest(!latency);\n            }\n\n        }\n\n        // Ignore the first request when using the XHR states. See the comments in the start() method for explanations.\n        else {\n            this._nextRequest();\n        }\n\n        return this;\n    }\n\n    /**\n     * End the measures.\n     * @private\n     * @method LatencyModule#_end\n     * @returns {LatencyModule}\n     */\n    _end()\n    {\n        let latencies = this._latencies;\n\n        // Get the average latency\n        let avgLatency = latencies.reduce((a, b) => a + b, 0) / (latencies.length || 1);\n        avgLatency = avgLatency || null;\n\n        // If there is not enough measures, display a warning.\n        if (latencies.length < this.settings().measures) {\n            let {measures, attempts} = this.settings();\n\n            console.warn([\n                'An insufficient number of measures have been processed, this could be due to your web server using',\n                `persistant connections or to your client settings (measures: ${measures}, attempts: ${attempts})`\n            ].join(' '));\n        }\n\n        // Trigger the \"end\" event with the average latency and the latency list as parameters\n        this.trigger('end', avgLatency, latencies);\n\n        return this;\n    }\n\n}\n",
    "import EventDispatcher from './EventDispatcher';\nimport HttpModule from './Http/HttpModule';\nimport LatencyModule from './Http/LatencyModule';\nimport BandwidthModule from './Http/BandwidthModule';\nimport Timing from './Timing';\nimport {getGlobalObject, isObject, assign, except} from '../utils/helpers';\nimport {enumerable} from '../utils/decorators';\n\n/**\n * @public\n * @typedef {Object} Network~settingsObject\n * @property {LatencyModule~settingsObject} latency\n * @property {BandwidthModule~settingsObject} upload\n * @property {BandwidthModule~settingsObject} download\n * @example\n * {\n *     // Top-level properties are applied to all the modules\n *     endpoint: './my-new-endpoint/',\n *\n *     // Top-level properties will be overridden by the ones specified in each module\n *     latency: {\n *         endpoint: './my-new-latency-endpoint/'\n *     }\n * }\n */\n\n/**\n * @class Network\n * @param {Network~settingsObject} [settings={}] A set of custom settings.\n * @member {LatencyModule} latency The latency module.\n * @member {BandwidthModule} upload The upload module.\n * @member {BandwidthModule} download The download module.\n */\nexport default class Network {\n\n    /**\n     * The registered modules.\n     * @private\n     * @member {Object} Network#_modules\n     */\n    @enumerable(false)\n    _modules = {};\n\n    /**\n     * Defines if the registered modules have been initialized.\n     * @private\n     * @member {boolean} Network#_modulesInitialized\n     */\n    @enumerable(false)\n    _modulesInitialized = false;\n\n    /**\n     * The settings defined via the constructor, they will be applied once the modules are initialized.\n     * @private\n     * @member {Network~settingsObject} Network#_pendingSettings\n     */\n    @enumerable(false)\n    _pendingSettings = {};\n\n    /**\n     * Expose all the internal classes to the global scope. Only for testing purposes!\n     * @private\n     * @method Network._exposeInternalClasses\n     * @returns {Network}\n     */\n    @enumerable(false)\n    static _exposeInternalClasses()\n    {\n        let global = getGlobalObject(),\n            classes = {EventDispatcher, HttpModule, LatencyModule, BandwidthModule, Timing};\n\n        Object.keys(classes).forEach(name => {\n            global[name] = classes[name];\n        });\n\n        return this;\n    }\n\n    constructor(settings = {})\n    {\n        this._registerModule('latency', settings => new LatencyModule(settings))\n            ._registerModule('upload', settings => new BandwidthModule('upload', settings))\n            ._registerModule('download', settings => new BandwidthModule('download', settings));\n\n        this._initModules(this.settings(settings));\n    }\n\n    /**\n     * Apply a new set of custom settings.\n     * @public\n     * @method Network#settings\n     * @param {Network~settingsObject} settings A set of custom settings.\n     * @returns {Network}\n     */\n    /**\n     * Return the current set of settings.\n     * @public\n     * @method Network#settings^2\n     * @returns {Network~settingsObject}\n     */\n    settings(settings = null)\n    {\n        let moduleNames = Object.keys(this._modules);\n\n        if (isObject(settings)) {\n            // Extract the global settings\n            let globalSettings = except(settings, moduleNames);\n\n            // Extract the local settings\n            let localSettings = except(settings, Object.keys(globalSettings));\n\n            // Create new settings with the global ones nested in the local ones\n            settings = moduleNames.reduce((settings, moduleName) => {\n                return assign(settings, {[moduleName]: globalSettings});\n            }, {});\n\n            // Apply the local settings to the new settings\n            settings = assign(settings, localSettings);\n\n            // Apply the settings to the modules\n            if (this._modulesInitialized) {\n                Object.keys(this._modules).forEach(name => {\n                    this._modules[name].settings(settings[name]);\n                });\n            }\n\n            // If the modules aren't instanciated, store the settings.\n            else {\n                this._pendingSettings = settings;\n            }\n\n            return this;\n        } else {\n            return moduleNames.reduce((settings, moduleName) => {\n                return assign(settings, {[moduleName]: this._modules[moduleName].settings()});\n            }, {});\n        }\n    }\n\n    /**\n     * Return if a module is currently making a request.\n     * @public\n     * @method Network#isRequesting\n     * @returns {boolean} `true` if a module is requesting, otherwise `false`.\n     */\n    isRequesting()\n    {\n        let requesting = false;\n\n        for (let name in this._modules) {\n            if (this._modules.hasOwnProperty(name)) {\n                requesting = requesting || this._modules[name].isRequesting();\n            }\n        }\n\n        return requesting;\n    }\n\n    /**\n     * Register a new module for the current `Network` instance.\n     * @private\n     * @method Network#registerModule\n     * @param {string} name The name of the module. Will be used to create the property `Network.<name>`.\n     * @param {Network~moduleCallback} moduleCallback A callback used to initialize a module with a set of settings.\n     * @returns {Network}\n     */\n    _registerModule(name, moduleCallback)\n    {\n        /**\n         * A callback used to initialize a module with a set of settings.\n         * @private\n         * @callback Network~moduleCallback\n         * @param {Object} settings A set of custom settings.\n         * @returns {HttpModule} An instanciated subclass of `HttpModule`.\n         */\n        this._modules[name] = moduleCallback;\n        return this;\n    }\n\n    /**\n     * Initialize all the registered modules with the settings passed to the constructor.\n     * @private\n     * @method Network#_initModules\n     * @returns {Network}\n     */\n    _initModules()\n    {\n        if (!this._modulesInitialized) {\n            // Initialize the modules with their respective settings\n            Object.keys(this._modules).forEach(name => {\n                this._modules[name] = this._modules[name](this._pendingSettings[name]).on('_newRequest', () => {\n                    return !this.isRequesting();\n                });\n\n                this[name] = this._modules[name];\n            });\n\n            this._modulesInitialized = true;\n        }\n\n        return this;\n    }\n\n}\n",
    "import {getGlobalObject} from '../utils/helpers';\nimport {enumerable} from '../utils/decorators';\n\n/**\n * @private\n * @class Timing\n */\nclass Timing {\n\n    /**\n     * Defines if the current browser supports some specific Timing APIs.\n     * @private\n     * @member {Object} Timing#_support\n     * @property {boolean} performance `true` if the Performance API is available.\n     * @property {boolean} userTiming `true` if the User Timing API is available.\n     * @property {boolean} resourceTiming `true` if the Resource Timing API is available.\n     */\n    @enumerable(false)\n    _support = {};\n\n    /**\n     * All the marks created by the `mark` method.\n     * @private\n     * @member {Object} Timing#_marks\n     */\n    @enumerable(false)\n    _marks = {};\n\n    /**\n     * All the measures created by the `measure` method.\n     * @private\n     * @member {Object} Timing#_measures\n     */\n    @enumerable(false)\n    _measures = {};\n\n    constructor()\n    {\n        const global = getGlobalObject();\n\n        this._support = {\n            performance: !!global.performance,\n            userTiming: global.performance && performance.mark,\n            resourceTiming: global.performance\n                            && (typeof performance.getEntriesByType == \"function\")\n                            && performance.timing\n        };\n    }\n\n    /**\n     * Create a new timing mark.\n     * @public\n     * @method Timing#mark\n     * @param {string} label A label associated to the mark.\n     * @returns {Timing}\n     */\n    mark(label)\n    {\n        const support = this._support,\n              marks = this._marks;\n\n        if (support.userTiming) {\n            performance.mark(label);\n        }\n\n        if (support.performance) {\n            marks[label] = performance.now();\n        } else {\n            marks[label] = (new Date).getTime();\n        }\n\n        return this;\n    }\n\n    /**\n     * Measure the delay between two marks.\n     * @public\n     * @method Timing#measure\n     * @param {string} measureLabel A label associated to the measure.\n     * @param {string} markLabelA The label of the first mark.\n     * @param {string} markLabelB The label of the second mark.\n     * @returns {number} The measured value.\n     */\n    measure(measureLabel, markLabelA, markLabelB)\n    {\n        const support = this._support,\n              marks = this._marks,\n              measures = this._measures;\n\n        if (typeof measures[measureLabel] == 'undefined') {\n            const measureWithoutUserTiming = marks[markLabelB] - marks[markLabelA];\n\n            if (support.userTiming) {\n                performance.measure(measureLabel, markLabelA, markLabelB);\n                const entriesByName = performance.getEntriesByName(measureLabel);\n\n                // The performance API could return no corresponding entries in Firefox so we must use a fallback.\n                // See: https://github.com/nesk/network.js/issues/32#issuecomment-118434305\n                measures[measureLabel] = entriesByName.length ? entriesByName[0].duration : measureWithoutUserTiming;\n            } else {\n                measures[measureLabel] = measureWithoutUserTiming;\n            }\n        }\n\n        return measures[measureLabel];\n    }\n\n    /**\n     * Determine if the current browser supports the Resource Timing API.\n     * @public\n     * @method Timing#supportsResourceTiming\n     * @returns {boolean} `true` if the Resource Timing API is supported, otherwise `false`.\n     */\n    supportsResourceTiming()\n    {\n        return this._support.resourceTiming;\n    }\n\n}\n\nexport default new Timing();\n",
    "/**\n * @callback propertyDecorator\n * @param target\n * @param key\n * @param descriptor\n */\n\n/**\n * Set the enumerability of a property.\n * @private\n * @function enumerable\n * @param {boolean} isEnumerable Whether the property should be enumerable or not.\n * @returns {propertyDecorator}\n */\nexport function enumerable(isEnumerable) {\n    return function(target, key, descriptor) {\n        descriptor.enumerable = isEnumerable;\n        return descriptor;\n    };\n}\n",
    "/**\n * Return the global object.\n * @private\n * @function getGlobalObject\n * @return {Object}\n * @see https://gist.github.com/rauschma/1bff02da66472f555c75\n */\nexport function getGlobalObject() {\n    // Workers don’t have `window`, only `self`.\n    if (typeof self !== 'undefined') {\n        return self;\n    }\n\n    if (typeof global !== 'undefined') {\n        return global;\n    }\n\n    // Not all environments allow `eval` and `Function`, use only as a last resort.\n    return new Function('return this')();\n}\n\n/**\n * Determine if the provided value is an object.\n * @private\n * @function isObject\n * @param {*} obj The value to check.\n * @returns {boolean} `true` if the value is an object, otherwise `false`.\n */\nexport function isObject(obj)\n{\n    return obj != undefined && obj != null && typeof obj.valueOf() == 'object';\n}\n\n/**\n * Make a deep copy of any value.\n * @private\n * @function copy\n * @param {*} value The value to copy.\n * @returns {*} The copied value.\n */\nexport function copy(value)\n{\n    return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * Copy the properties in the source objects over to the destination object.\n * @private\n * @function _assign\n * @param {boolean} strict Given `true`, new properties will not be copied.\n * @param {Object} [target={}] The destination object.\n * @param {...Object} sources The source objects.\n * @returns {Object} The destination object once the properties are copied.\n */\nfunction _assign(strict, target = {}, ...sources)\n{\n    target = copy(target);\n\n    sources.forEach(source => {\n        Object.keys(source).forEach(key => {\n            if (!strict || target.hasOwnProperty(key)) {\n                let value = source[key];\n                target[key] = isObject(value) ? _assign(strict, target[key], value) : value;\n            }\n        })\n    });\n\n    return target;\n}\n\n/**\n * Copy all the properties in the source objects over to the destination object.\n * @private\n * @function assign\n * @param {Object} [target={}] The destination object.\n * @param {...Object} sources The source objects.\n * @returns {Object} The destination object once the properties are copied.\n */\nexport function assign(target = {}, ...sources)\n{\n    return _assign(false, target, ...sources);\n}\n\n/**\n * Copy the properties (but no new ones) in the source objects over to the destination object.\n * @private\n * @function assignStrict\n * @param {Object} [target={}] The destination object.\n * @param {...Object} sources The source objects.\n * @returns {Object} The destination object once the properties are copied.\n */\nexport function assignStrict(target = {}, ...sources)\n{\n    return _assign(true, target, ...sources);\n}\n\n/**\n * Get a copy of an object without some of its properties.\n * @private\n * @function except\n * @param {Object} obj The original object.\n * @param {string[]} properties The properties to exclude from the copied object.\n * @returns {Object} The copied object without the specified properties.\n */\nexport function except(obj, properties)\n{\n    let objCopy = copy(obj);\n\n    properties.forEach(index => delete objCopy[index]);\n\n    return objCopy;\n}\n\n/**\n * Defer the execution of a function.\n * @private\n * @function defer\n * @param {Function} func The function to defer.\n * @returns {Defer} The Defer object used to execute the function when needed.\n */\nexport function defer(func = () => {})\n{\n    /**\n     * @private\n     * @class Defer\n     */\n    return new class {\n        constructor()\n        {\n            this.func = func;\n        }\n\n        /**\n         * Execute the deferred function.\n         * @public\n         * @method Defer#run\n         */\n        run()\n        {\n            if (this.func) this.func();\n            delete this.func;\n        }\n    };\n}\n"
  ]
}