{"version":3,"sources":["webpack:///./src/shared/utils/index.ts","webpack:///./src/shared/components/index.ts","webpack:///./src/shared/api/services/index.ts","webpack:///./src/shared/api/services/ApiService.ts","webpack:///./src/shared/components/Control.tsx","webpack:///./src/shared/components/CommonModalHeaderControls.tsx","webpack:///./src/shared/components/FeatureGroup.tsx","webpack:///./src/shared/utils/componentUtils.ts","webpack:///./src/shared/components/CommonModalFooterControls.tsx","webpack:///./src/shared/constants.ts","webpack:///./src/shared/components/LabelledControl.tsx","webpack:///./src/shared/components/WaitIndicator.tsx","webpack:///./src/shared/components/MITransferTable.tsx","webpack:///./src/shared/api/commUtil.ts","webpack:///./src/shared/utils/applicationUtils.ts","webpack:///./src/shared/components/LabelledProgressBar.tsx","webpack:///./src/shared/components/LoadingSpinner.tsx","webpack:///./src/shared/services/index.ts","webpack:///./src/shared/api/services/UsersApiService.ts","webpack:///./src/shared/components/ContentSectionWrapper.tsx","webpack:///./src/shared/components/FormattedLocaleDate.tsx","webpack:///./src/shared/components/Beltline.tsx","webpack:///./src/shared/api/services/PackagesApiService.ts","webpack:///./src/shared/api/services/TokenService.ts","webpack:///./src/shared/utils/formattingUtils.ts","webpack:///./src/shared/utils/fileUtils.ts","webpack:///./src/shared/utils/debugUtils.ts","webpack:///./src/shared/components/ErrorAlert.tsx","webpack:///./src/shared/components/WarningAlert.tsx","webpack:///./src/shared/components/ApplicationLinkButton.tsx","webpack:///./src/shared/components/DebouncedTextInput.tsx","webpack:///./src/shared/services/HashService.ts","webpack:///./src/shared/api/services/ContactsApiService.ts","webpack:///./src/shared/api/services/FoldersApiService.ts","webpack:///./src/shared/api/services/UploadApiService.ts","webpack:///./src/shared/api/services/DownloadValidateApiService.ts","webpack:///./src/shared/api/services/SettingsApiService.ts","webpack:///./src/shared/components/PageWrapper.tsx","webpack:///./src/shared/components/FeatureGroupNumericTitle.tsx","webpack:///./src/shared/components/FeatureGroupIconTitle.tsx","webpack:///./src/shared/components/FeatureGroupBoxedIconTitle.tsx","webpack:///./src/shared/components/FormikFieldGroup.tsx","webpack:///./src/shared/api/services/OrgsApiService.ts","webpack:///./src/shared/services/HelpUrlBuilderService.ts","webpack:///./src/shared/api/services/PublicDownloadLinkApiService.ts"],"names":["default","baseUrl","language","this","endsWith","substr","length","tokenService","TokenService","getInstance","get","url","params","preventCache","doRequestWithToken","token","fullUrl","getApiUrl","headers","Object","assign","getTokenHeaders","getNoCacheHeaders","then","response","data","post","options","getAxiosRequestConfig","put","delete","signOut","revokeToken","requestFn","getTokenAndExecuteRequest","forceRefresh","getToken","catch","error","status","object","isString","Promise","reject","detail","message","onUploadProgress","defaults","validateStatus","cancelToken","ApiService","props","classes","className","children","helpButton","help","type","onClick","onHelp","closeButton","close","onClose","FeatureGroupContent","useGetLatest","obj","ref","useRef","current","useCallback","useToggle","initial","useState","flag","setFlag","useBoolean","value","output","replace","toLowerCase","defaultFn","defaultWait","debounceRef","getDefaultFn","getDefaultWait","promise","resolve","timeout","clearTimeout","setTimeout","args","document","createElement","action","method","keys","forEach","argName","field","name","appendChild","body","submit","e","alert","makeButton","variant","additionalClasses","Button","disabled","disable","label","primaryButton","primary","secondaryButton","secondary","cancelButton","cancel","Fragment","DEBOUNCE_INTERVAL","TRANSFER_DOC_VERSION","WaitIndicator","title","description","useWaitIndicator","setTrue","setFalse","waitElement","useMemo","useWaitOnPromise","showWait","hideWait","finally","columns","useTable","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","cellPadding","caption","map","headerGroup","ind1","getHeaderGroupProps","key","column","ind2","getHeaderProps","scope","render","row","getRowProps","cells","cell","getCellProps","relativeUrl","startsWith","Authorization","access_token","makeLinkPart","makeApplicationLink","linkParts","push","arg01","arg02","arg03","arg04","arg05","arg06","arg07","arg08","arg09","arg10","arg11","arg12","filter","x","join","navigateToApplicationLink","link","window","location","href","resolveLabel","match","group","String","Math","round","now","max","Row","Col","xs","labelLeft","labelRight","ProgressBar","min","classNames","getSelf","getUserList","usernameFilter","fullNameFilter","emailFilter","permissionFilter","statusFilter","page","perPage","sortField","sortDirection","username","fullName","email","permission","UsersApiService","sectionTitle","intl","useIntl","date","formatTransferLocaleDate","locale","Beltline","BeltlineItem","labelClass","content","contentClass","BeltlineQuantity","quantity","quantityTotal","formatMessage","id","part","total","getPackageRequirements","PackagesApiService","tokenServicePool","tokenPromise","timerHandle","refreshing","tokenString","sessionStorage","getItem","JSON","parse","resetPool","getOwnPropertyNames","entry","resetTokenPromise","formHeaders","getFormHeaders","qs","stringify","clearToken","removeItem","unsetTimer","doAcquire","acquireToken","newToken","expirationTimestamp","Date","isExpiredToken","TOKEN_REFRESH_THRESHOLD_SECONDS","shouldRefreshToken","refreshToken","setTimer","processToken","expires_in","calculateTokenExpirationTimestamp","setItem","grant_type","refresh_token","dueTime","executeRefresh","formatNumber","num","Number","isInteger","toString","toFixed","formatDurationDescription","unit","adjustDateTimeString","dateTimeString","KiB","MiB","GiB","isNaN","floor","bytecount","gbCount","mbCount","kbCount","milliseconds","minimumUnit","duration","lessThanOne","getDurationDescription","assembleDescription","descriptionParts","asSeconds","asMinutes","asHours","asDays","asMonths","asYears","parts","years","months","days","hours","minutes","seconds","intlLocale","year","month","day","hour","minute","second","toLocaleDateString","time","toLocaleTimeString","getFileArrayFromFileList","items","Array","count","i","dataTransferItemIsFolder","item","webkitGetAsEntry","isDirectory","dataTransfer","files","getAsFile","getFileArrayFromDataTransferItemList","isDev","state","Alert","messageId","FormattedMessage","details","values","messageValues","DebouncedTextInput","timerId","setTimerId","clearTimer","useEffect","onChange","newValue","target","onImmediateChange","onDebouncedChange","debounceTime","debounceChange","placeholder","placeHolder","hashFile","file","onProgress","md","Rusha","createHash","hashNextPart","offset","blob","nextPart","slice","newOffset","fr","FileReader","addEventListener","result","readAsArrayBuffer","update","progress","size","hashParts","digest","getContacts","searchString","onBehalfOf","ContactsApiService","getFolderList","nameFilter","pathFilter","path","getFolderDetails","split","folderId","param","encodeURIComponent","FoldersApiService","initResumableUpload","fileName","fileSize","comments","FormData","append","continueResumableUpload","fileId","contentRange","fileHash","cancelTokenSource","startOffset","endOffset","totalSize","isLastChunk","UploadApiService","validateDownloadHash","hash","downloadId","logId","downloadid","fileid","logid","updateLogos","useCustomNotifBranding","leftLogo","rightLogo","backgroundLogo","resetRightLogo","resetBackgroundLogo","SettingsApiService","pageTitle","FeatureGroupNumericTitle","titleNumber","FeatureGroupIconTitle","iconClassName","FeatureGroupBoxedIconTitle","subtitle","alertBoxVariant","fragile","useField","meta","isInvalid","touched","htmlFor","Feedback","getPublicKeys","orgId","makeUrl","beginKeyRotationEstimate","removeKeyRotationEstimate","getKeyRotationPassphrase","validateKeyRotationPassphrase","passphrase","getKeyRotationReminder","setKeyRotationReminder","reminderDate","beginKeyRotation","schedule","pauseKeyRotation","resumeKeyRotation","setKeyRotationSchedule","getKeyRotationStatus","removeKeyRotationStatus","endpoint","userType","languageCode","getHelpUrl","targetId","generatePublicDownloadLink","publicLinkParams","getPublicLinkInfo","publicLinkId","deletePublicLink","PublicDownloadLinkApiService"],"mappings":"6bAAA,YACA,YACA,YACA,YACA,a,qYCJA,aAAS,yEAAAA,WACT,aAAS,iFAAAA,WACT,aAAS,qFAAAA,WACT,aAAS,2FAAAA,WACT,aAAS,2FAAAA,WACT,aAAS,4EAAAA,WACT,aAAS,8EAAAA,WACT,aAAS,uFAAAA,WACT,YACA,a,qYCTA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YAEA,aAAS,4FAAAA,WACT,YACA,a,0LCbA,gBAGA,SAGA,SAgBA,iBAII,WAAYC,EAAiBC,QAAA,IAAAA,MAAA,IAHZ,KAAAD,QAAkB,GAI/BE,KAAKF,QAAUA,EAEXE,KAAKF,QAAQG,SAAS,OACtBD,KAAKF,QAAUE,KAAKF,QAAQI,OAAO,EAAGF,KAAKF,QAAQK,OAAS,IAGhEH,KAAKI,aAAe,EAAAC,aAAaC,YAAYR,EAASC,GA8F9D,OA3FW,YAAAQ,IAAP,SAAcC,EAAaC,EAAiBC,GAA5C,WAWI,OAAOV,KAAKW,oBAVM,SAACC,GACf,IAAMC,EAAU,EAAAC,UAAU,EAAKhB,QAASU,GAClCO,EAAUC,OAAOC,OACnB,GACA,EAAAC,gBAAgBN,GAChBF,EAAe,EAAAS,oBAAsB,IAEzC,OAAO,UAAMZ,IAAIM,EAAS,CAAEE,QAAO,EAAEN,OAAM,IAAIW,MAAK,SAAAC,GAAY,OAAAA,EAASC,YAM1E,YAAAC,KAAP,SACIf,EACAc,EACAP,EACAS,GAJJ,WAcI,OAAOxB,KAAKW,oBARM,SAACC,GACf,IAAMC,EAAU,EAAAC,UAAU,EAAKhB,QAASU,GAExC,OADAO,EAAUC,OAAOC,OAAO,GAAI,EAAAC,gBAAgBN,GAAQG,GAC7C,UACFQ,KAAKV,EAASS,EAAMG,EAAsBV,EAASS,IACnDJ,MAAK,SAAAC,GAAY,OAAAA,EAASC,YAMhC,YAAAI,IAAP,SACIlB,EACAc,EACAP,EACAS,GAJJ,WAcI,OAAOxB,KAAKW,oBARM,SAACC,GACf,IAAMC,EAAU,EAAAC,UAAU,EAAKhB,QAASU,GAExC,OADAO,EAAUC,OAAOC,OAAO,GAAI,EAAAC,gBAAgBN,GAAQG,GAC7C,UACFW,IAAIb,EAASS,EAAMG,EAAsBV,EAASS,IAClDJ,MAAK,SAAAC,GAAY,OAAAA,EAASC,YAMhC,YAAAK,OAAP,SAAiBnB,EAAaO,EAAkBS,GAAhD,WASI,OAAOxB,KAAKW,oBARM,SAACC,GACf,IAAMC,EAAU,EAAAC,UAAU,EAAKhB,QAASU,GAExC,OADAO,EAAUC,OAAOC,OAAO,GAAI,EAAAC,gBAAgBN,GAAQG,GAC7C,UACFY,OAAOd,EAASY,EAAsBV,EAASS,IAC/CJ,MAAK,SAAAC,GAAY,OAAAA,EAASC,YAMhC,YAAAM,QAAP,WACI,OAAO5B,KAAKI,aAAayB,eAGrB,YAAAlB,mBAAR,SAA8BmB,GAA9B,WACUC,EAA4B,SAACC,GAC/B,OAAO,EAAK5B,aAAa6B,SAASD,GAAcZ,KAAKU,IAuBzD,OAAOC,GAA0B,GAAOG,OApBpB,SAACC,GACjB,GAAIA,EAAMd,SAAU,CAChB,GAA8B,MAA1Bc,EAAMd,SAASe,OAIf,OAAOL,GAA0B,GAIrC,IAjGIM,EAiGWF,EAAMd,SAASC,QArG9C,SAAkBe,GACd,MAAyB,iBAAXA,EAIIC,CAASD,IAAW,WAAYA,EAiGlC,OAAOE,QAAQC,OAAQL,EAAMd,SAASC,KAAkBmB,QAlG5E,IAAoBJ,EAwGR,OAAOE,QAAQC,OAAOL,EAAMO,SAAWP,OAKnD,EAzGA,GA2GA,SAASV,EAAsBV,EAAkBS,GAC7C,MAAO,CACHT,QAAO,EACP4B,iBAAmBnB,GAAWA,EAAQmB,kBAAqB,UAAMC,SAASD,iBAC1EE,eAAiBrB,GAAWA,EAAQqB,gBAAmB,UAAMD,SAASC,eACtEC,YAActB,GAAWA,EAAQsB,aAAgB,UAAMF,SAASE,aAhH3D,EAAAC,c,qrBCtBb,cAEA,WAEA,OAYA,UANiD,SAAAC,GAC7C,IAAMC,EAAU,UAAW,mBAAoBD,EAAME,WAErD,OAAO,uBAAKA,UAAWD,GAAUD,EAAMG,Y,qmBCb3C,cAoCA,UA1BqF,SAAAH,GACjF,IAAMI,EAAaJ,EAAMK,KACrB,0BAAQC,KAAK,SAASJ,UAAU,iBAAiBK,QAASP,aAAK,EAALA,EAAOQ,QAC7D,qBAAGN,UAAU,4BAEjB,KAEEO,EAAcT,EAAMU,MACtB,0BACIJ,KAAK,SACLJ,UAAU,iBAAgB,cACd,4BACZK,QAASP,aAAK,EAALA,EAAOW,SAEhB,qBAAGT,UAAU,6BAEjB,KAEJ,OACI,uBAAKA,UAAU,kBACVE,EACAK,K,kfC/Bb,cACA,WAEA,OAEa,EAAAG,oBAA6C,SAAC,G,IAAET,EAAQ,WACjE,OAAO,+BAAKD,UAAU,qBAAqBC,IAW/C,UAJ2D,SAAC,G,IAAED,EAAS,YAAEC,EAAQ,WAC7E,OAAO,+BAAKD,UAAW,UAAW,0BAA2BA,IAAaC,IAI9E,YACA,YACA,a,ykECpBA,cAsCA,SAAgBU,EAA2BC,GACvC,IAAMC,EAAM,UAAMC,SAGlB,OAFAD,EAAIE,QAAUH,EAEP,UAAMI,aAAY,WAAM,OAAAH,EAAIE,UAAS,IAxCnC,EAAAE,UAAY,SACrBC,QAAA,IAAAA,OAAA,GAEM,MAAkB,EAAAC,SAASD,GAA1BE,EAAI,KAAEC,EAAO,KAEpB,MAAO,CAACD,EADW,WAAM,OAAAC,GAASD,IACRC,IAEjB,EAAAC,WAAa,SACtBJ,QAAA,IAAAA,OAAA,GAEM,MAAkB,EAAAC,SAASD,GAA1BE,EAAI,KAAEC,EAAO,KAGpB,MAAO,CAACD,EAFQ,WAAM,OAAAC,GAAQ,IACb,WAAM,OAAAA,GAAQ,IACEA,IASrC,2BAAgCE,GAC5B,IAAIC,EAASD,GAAS,KAEtB,OADAC,EAASA,EAAOC,QAAQ,IAAK,KAAKC,eAYtC,iBAcA,4BACIC,EACAC,GAFJ,WAIUC,EAAc,UAAMf,OAKvB,IAGGgB,EAAenB,EAAagB,GAC5BI,EAAiBpB,EAAaiB,GAEpC,OAAO,UAAMZ,aACT,W,IAAQ,sD,2EAyBJ,OAvBKa,EAAYd,QAAQiB,UACrBH,EAAYd,QAAQiB,QAAU,IAAI3C,SAAQ,SAAC4C,EAAS3C,GAChDuC,EAAYd,QAAQkB,QAAUA,EAC9BJ,EAAYd,QAAQzB,OAASA,MAIjCuC,EAAYd,QAAQmB,SACpBC,aAAaN,EAAYd,QAAQmB,SAGrCL,EAAYd,QAAQmB,QAAUE,YAAW,gD,mEAE9BP,EAAYd,QAAQmB,Q,iBAEK,O,uBAA5B,KAAAL,EAAYd,SAAQkB,QAAQ,GAAMH,IAAc,aAAIO,I,cAApD,WAA4B,W,+BAE5BR,EAAYd,QAAQzB,OAAO,G,2BAEpBuC,EAAYd,QAAQiB,Q,8BAEhCD,KAEI,CAAP,EAAOF,EAAYd,QAAQiB,iBAE/B,CAACF,EAAcC,KAyBvB,8BAAmCM,GAC/B,IACI,IAAM,EAAOC,SAASC,cAAc,QACpC,EAAKC,OAAS,aACd,EAAKC,OAAS,OACd3E,OAAO4E,KAAKL,GAAMM,SAAQ,SAAAC,GACtB,IAAMC,EAAQP,SAASC,cAAc,SACrCM,EAAMzC,KAAO,SACbyC,EAAMC,KAAOF,EACbC,EAAMtB,MAAQc,EAAKO,IAAY,GAC/B,EAAKG,YAAYF,MAErBP,SAASU,KAAKD,YAAY,GAC1B,EAAKE,SACP,MAAOC,GACLC,MAAM,4BAA8BD,GAExC,OAAO,I,sKCzIX,cAEA,QACA,WA4BA,SAASE,EACLC,EACAvD,EACAwD,GAEA,OACI,wBAAC,EAAAC,OAAM,CACHF,QAASA,EACTrD,UAAW,UAAW,CAAEwD,SAAU1D,EAAM2D,SAAWH,GACnDjD,QAASP,EAAMO,QACfmD,SAAU1D,EAAM2D,QAAO,cACV,uBAAuBJ,GAEnCvD,EAAM4D,OAKnB,UAhCqF,SAAA5D,GACjF,IAAM6D,EAAgB7D,EAAM8D,QAAUR,EAAW,UAAWtD,EAAM8D,SAAW,KACvEC,EAAkB/D,EAAMgE,UAAYV,EAAW,YAAatD,EAAMgE,WAAa,KAC/EC,EAAejE,EAAMkE,OAASZ,EAAW,OAAQtD,EAAMkE,OAAQ,cAAgB,KAErF,OACI,wBAAC,UAAMC,SAAQ,KACVN,EACAE,EACAE,K,oIC1BA,EAAAG,kBAAoB,IACpB,EAAAC,qBAAuB,Q,qrBCDpC,cAGA,YAEA,OAiBA,UAXiE,SAAArE,GAC7D,OACI,gBAAC,UAAO,KACJ,yBAAOE,UAAU,0BACb,4BAAOF,EAAM4D,OACZ5D,EAAMG,a,kqBChBvB,cAEA,SAOa,EAAAmE,cAAuD,SAAC,G,IAAEC,EAAK,QAAEC,EAAW,cAErF,OACI,wBAAC,UAAML,SAAQ,KACX,+BAAKjE,UAAU,gCACf,+BAAKA,UAAU,0BACX,+BAAKA,UAAU,yBACX,+BAAKA,UAAU,yBACX,+BAAKA,UAAU,0BAEnB,+BAAKA,UAAU,sBACX,+BAAKA,UAAU,uBAAuBqE,GACtC,+BAAKrE,UAAU,6BAA6BsE,QAWvD,EAAAC,iBAAmB,SAC5BF,EACAC,GAEM,MAA4B,EAAAhD,YAAW,GAAtCF,EAAI,KAAEoD,EAAO,KAAEC,EAAQ,KACxBC,EAAc,EAAAC,SAChB,WAAM,+BAAC,EAAAP,cAAa,CAACC,MAAOA,EAAOC,YAAaA,MAChD,IAGJ,MAAO,CAAClD,EAAOsD,EAAc,KAAMF,EAASC,IAOnC,EAAAG,iBAAmB,SAC5BP,EACAC,GAEM,MAAoC,EAAAC,iBAAiBF,EAAOC,GAA3DI,EAAW,KAAEG,EAAQ,KAAEC,EAAQ,KAOtC,MAAO,CAACJ,EALa,SAAC1C,GAClB6C,IACA7C,EAAQ+C,QAAQD,O,y5BCzDxB,cACA,SACA,WAEA,OA8EA,UAvEwB,SAAmBhF,GACvC,IAAMkF,EAAuB,EAAAL,SAAQ,WAAM,OAAA7E,EAAMkF,UAAS,CAAClF,EAAMkF,UAE3D,EAAuE,EAAAC,SAAS,EAAD,KAC9EnF,GAAK,CACRkF,QAAO,KAFHE,EAAa,gBAAEC,EAAiB,oBAAEC,EAAY,eAAEC,EAAI,OAAEC,EAAU,aAKxE,OACI,qCAAWJ,IAAe,CAAEK,YAAY,IAAIvF,UAAW,UAAG,YAAaF,EAAME,aACzE,uCAAUF,EAAM0F,SAChB,iCAAOxF,UAAU,oBAEboF,EAAaK,KAAI,SAACC,EAAaC,GAAS,OAEpC,kCACQD,EAAYE,sBAAqB,CACrC5F,UAAU,aACV6F,IAAKF,EAAO,gBAGZD,EAAY7H,QAAQ4H,KAAI,SAACK,EAAQC,GAAS,OAEtC,kCACQD,EAAOE,iBAAgB,CAC3BC,MAAM,MACNjG,UAAU,iCACV6F,IAAKE,EAAO,iBAGZD,EAAOI,OAAO,mBAOlC,qCAAWf,KAEPE,EAAKI,KAAI,SAACU,EAAKR,G,MAGX,OADAL,EAAWa,GAGP,kCACQA,EAAIC,cAAa,CACrBpG,UAAW,UAAG,iBAAe,KAAI,EAAC,WAAW2F,EAAO,EAAK,KAAM,EAAI,IACnEE,IAAKF,EAAO,SAGZQ,EAAIE,MAAMZ,KAAI,SAACa,EAAMP,GAEjB,OACI,kCACQO,EAAKC,eAAc,CACvBvG,UAAU,0BACV6F,IAAKE,EAAO,UAGZO,EAAKJ,OAAO,oB,4JCpEpD,qBAA0BtJ,EAAiB4J,GAKvC,OAJIA,IAAgBA,EAAYC,WAAW,OACvCD,EAAc,IAAIA,GAGf5J,EAAU,UAAY4J,GAGjC,4BACI,MAAO,CAAE,eAAgB,sCAG7B,2BAAgC9I,GAC5B,OAAOA,EAAQ,CAAEgJ,cAAe,UAAUhJ,EAAMiJ,cAAmB,IAIvE,+BACI,MAAO,CAAE,gBAAiB,WAAY,OAAU,WAAY,QAAW,K,iCCL3E,SAASC,EAAa9D,EAAcvB,GAChC,GAAIA,EACA,OAAUuB,EAAI,IAAIvB,E,0GAIb,EAAAsF,oBAAsB,SAAC/G,GAChC,IAAMgH,EAAsB,GAe5B,OAbAA,EAAUC,KAAKH,EAAa,QAAS9G,EAAMkH,QAC3CF,EAAUC,KAAKH,EAAa,QAAS9G,EAAMmH,QAC3CH,EAAUC,KAAKH,EAAa,QAAS9G,EAAMoH,QAC3CJ,EAAUC,KAAKH,EAAa,QAAS9G,EAAMqH,QAC3CL,EAAUC,KAAKH,EAAa,QAAS9G,EAAMsH,QAC3CN,EAAUC,KAAKH,EAAa,QAAS9G,EAAMuH,QAC3CP,EAAUC,KAAKH,EAAa,QAAS9G,EAAMwH,QAC3CR,EAAUC,KAAKH,EAAa,QAAS9G,EAAMyH,QAC3CT,EAAUC,KAAKH,EAAa,QAAS9G,EAAM0H,QAC3CV,EAAUC,KAAKH,EAAa,QAAS9G,EAAM2H,QAC3CX,EAAUC,KAAKH,EAAa,QAAS9G,EAAM4H,QAC3CZ,EAAUC,KAAKH,EAAa,QAAS9G,EAAM6H,QAEpC,IAAMb,EAAUc,QAAO,SAAAC,GAAK,OAAAA,KAAGC,KAAK,MAGlC,EAAAC,0BAA4B,SAACjI,GACtC,IAAMkI,EAAO,EAAAnB,oBAAoB/G,GACjCmI,OAAOC,SAASC,KAAOH,I,qrBC1C3B,cAEA,QAEA,YAEA,OA2CA,UAjCyE,SAAAlI,GACrE,IAAMsI,EAAe,SAAC1E,GAClB,OAAOA,EAAMjC,QAAQ,aAAa,SAAC4G,EAAOC,GACtC,OAAQA,GACJ,IAAK,UACD,OAAOC,OAAOC,KAAKC,MAAO3I,EAAM4I,IAAM5I,EAAM6I,IAAO,MAAQ,IAC/D,QACI,MAAO,QAKvB,OACI,gBAAC,UAAO,KACJ,uBAAK3I,UAAU,yBACX,gBAAC,EAAA4I,IAAG,KACA,gBAAC,EAAAC,IAAG,CAACC,GAAI,EAAG9I,UAAU,cACjBoI,EAAatI,EAAMiJ,YAExB,gBAAC,EAAAF,IAAG,CAACC,GAAI,EAAG9I,UAAU,eACjBoI,EAAatI,EAAMkJ,cAG5B,gBAAC,EAAAJ,IAAG,KACA,gBAAC,EAAAC,IAAG,CAACC,GAAI,IACL,gBAAC,EAAAG,YAAW,CAACC,IAAKpJ,EAAMoJ,IAAKP,IAAK7I,EAAM6I,IAAKD,IAAK5I,EAAM4I,Y,sKCzChF,cACA,WASA,UAPmE,SAAC,G,IAAES,EAAU,aAAO,OAEnF,+BAAKnJ,UAAW,UAAG,wBAAyBmJ,IACxC,+BAAKnJ,UAAU,4B,kFCNvB,aAAS,6EAAArD,Y,2bCAT,IAMA,cACI,WAAYC,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAoChC,OAtCqC,OAK1B,YAAAuM,QAAP,WACI,OAAOtM,KAAKO,IAAsB,eAG/B,YAAAgM,YAAP,SACIC,EACAC,EACAC,EACAC,EAOAC,EACAC,EACAC,EACAC,EACAC,GAEA,YALA,IAAAH,MAAA,QACA,IAAAC,MAAA,SACA,IAAAC,MAAA,iBACA,IAAAC,MAAA,aAEOhN,KAAKO,IAAiC,QAAS,CAClD0M,SAAUT,EACVU,SAAUT,EACVU,MAAOT,EACPU,WAAYT,EACZvK,OAAQwK,EACRC,KAAI,EACJC,QAAO,EACPC,UAAS,EACTC,cAAa,KAGzB,EAtCA,CANA,OAMqCjK,YAAxB,EAAAsK,mB,sKCNb,cACA,WAEA,OAgBA,UAT6E,SAAArK,GACzE,OACI,+BAAKE,UAAW,UAAW,4BAA6BF,EAAME,YAC1D,8BAAIA,UAAU,uCAAuCF,EAAMsK,cAC1DtK,EAAMG,Y,sKCdnB,cACA,QACA,QAcA,UANyE,SAAAH,GACrE,IAAMuK,EAAO,EAAAC,UACPC,EAAO,EAAAC,yBAAyB1K,EAAMyK,KAAMzK,EAAM2K,QAAUJ,EAAKI,QACvE,OAAO3K,EAAME,UAAY,gCAAMA,UAAWF,EAAME,WAAYuK,GAAe,gDAAGA,K,0NCblF,cACA,QACA,WAEA,OAWa,EAAAG,SAA6C,SAAC,G,IAAEzK,EAAQ,WAAED,EAAS,YAC5E,OAAO,+BAAKA,UAAW,UAAW,qBAAsBA,IAAaC,IAU5D,EAAA0K,aAAoD,SAAC,G,IAC9DjH,EAAK,QACLkH,EAAU,aACVC,EAAO,UACPC,EAAY,eACZ9K,EAAS,YAET,OACI,+BAAKA,UAAW,UAAW,kBAAmBA,IAC1C,gCAAMA,UAAW,UAAW,wBAAyB4K,IAAclH,GACnE,gCAAM1D,UAAW,UAAW,0BAA2B8K,IAAgBD,KAatE,EAAAE,iBAAiE,SAAC,G,IAC3ErH,EAAK,QACLkH,EAAU,aACVI,EAAQ,WACRC,EAAa,gBACbH,EAAY,eACZ9K,EAAS,YAEHqK,EAAO,EAAAC,UACPO,EAAUI,EACZZ,EAAKa,cACD,CAAEC,GAAI,wBACN,CACIC,KAAM,gCAAMpL,UAAU,0BAA0BgL,GAChDK,MAAO,gCAAMrL,UAAU,2BAA2BiL,KAI1D,gCAAMjL,UAAU,2BAA2BgL,GAE/C,OACI,wBAAC,EAAAL,aAAY,CACT3K,UAAW,UAAW,oBAAqBA,GAC3C0D,MAAOA,EACPkH,WAAYA,EACZC,QAASA,EACTC,aAAcA,KAK1B,UAAe,EAAAJ,U,8bC/Ef,IAGA,cACI,WAAY9N,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAMhC,OARwC,OAK7B,YAAAyO,uBAAP,WACI,OAAOxO,KAAKO,IAA8B,0BAElD,EARA,CAHA,OAGwCwC,YAA3B,EAAA0L,sB,2sBCJb,gBACA,YAIA,SAMMC,EAAyD,GAE/D,aA+BI,WAAoB5O,EAAiBC,GAPpB,KAAAD,QAAkB,GAClB,KAAAC,SAAmB,GAC5B,KAAAa,MAAe,KACf,KAAA+N,aAA+B,KAC/B,KAAAC,YAAmB,KACnB,KAAAC,YAAsB,EAG1B7O,KAAKF,QAAUA,EACfE,KAAKD,SAAWA,EAEhB,IAAM+O,EAAcC,eAAeC,QAzCX,gBA0CpBF,IACA9O,KAAKY,MAAQqO,KAAKC,MAAMJ,IAyHpC,OAxJkB,EAAAxO,YAAd,SAA0BR,EAAiBC,GAKvC,OAJK2O,EAAiB5O,KAClB4O,EAAiB5O,GAAW,IAAIO,EAAaP,EAASC,IAGnD2O,EAAiB5O,IAMd,EAAAqP,UAAd,WAEI,IADA,IACoB,MADAnO,OAAOoO,oBAAoBV,GAC3B,eAAa,CAA5B,IAAMW,EAAK,YACLX,EAAiBW,KAyBzB,YAAApN,SAAP,SAAgBD,GAKZ,OAJKA,IAAiBhC,KAAK6O,aAAgB7O,KAAK2O,eAC5C3O,KAAKsP,kBAAkBtN,GAGpBhC,KAAK2O,cAGT,YAAA9M,YAAP,sBACUrB,EAAM,EAAAM,UAAUd,KAAKF,QAAS,gBAC9BwB,EAAO,CAAEV,MAAOZ,KAAKY,MAAMiJ,cAC3B0F,EAAc,EAAAC,iBACpB,OAAO,UACFjO,KAAKf,EAAKiP,EAAGC,UAAUpO,GAAO,CAAEP,QAASwO,IACzCnO,MAAK,WAAM,SAAKuO,iBAGlB,YAAAA,WAAP,WACI3P,KAAKY,MAAQ,KACbZ,KAAK2O,aAAe,KACpBI,eAAea,WAvES,iBA0EpB,YAAAN,kBAAR,SAA0BtN,GAA1B,WACIhC,KAAK6P,aACL7P,KAAK2O,aAAe,IAAIpM,SAAQ,SAAC4C,EAAS3C,GACtC,IAyFU5B,EAzFJkP,EAAY,WACd,EAAKC,eAAe3O,MAChB,SAAA4O,GAAY,OAAA7K,EAAQ6K,MACpB,SAAA7N,GAAS,OAAAK,EAAOL,QAsFdvB,EA3EO,EAAKA,SA+ElC,SAAwBA,GACpB,OAAOA,EAAMqP,qBAAuBC,KAAKtE,MAJtBuE,CAAevP,GA3ElBoB,GAkFpB,SAA4BpB,GACxB,OAAOA,EAAMqP,oBAAsBC,KAAKtE,MAAQwE,IAnFhBC,CAAmB,EAAKzP,OAP5C,EAAK0P,eAAelP,MAChB,SAAA4O,GAAY,OAAA7K,EAAQ6K,MACpB,WAAM,OAAAF,QASD,EAAKlB,aACN,EAAK2B,SAAS,EAAK3P,MAAMqP,qBAE7B9K,EAAQ,EAAKvE,QAGjBkP,QAKJ,YAAAU,aAAR,SAAqB5P,GAMjB,OALAA,EAAMqP,oBAsEd,SAA2CrP,GACvC,OAAOsP,KAAKtE,MAA2B,IAAnBhL,EAAM6P,WAvEMC,CAAkC9P,GAC9DmO,eAAe4B,QA7GS,eA6GwB1B,KAAKS,UAAU9O,IAC/DZ,KAAKuQ,SAAS3P,EAAMqP,qBACpBjQ,KAAKY,MAAQA,EACbZ,KAAK6O,YAAa,EACXjO,GAGH,YAAAmP,aAAR,sBACUvP,EAAM,EAAAM,UAAUd,KAAKF,QAAS,SAC9BwB,EAAO,CACTsP,WAAY,UACZ7Q,SAAUC,KAAKD,UAGbwP,EAAc,EAAAC,iBACpB,OAAO,UACFjO,KAAKf,EAAKiP,EAAGC,UAAUpO,GAAO,CAAEP,QAASwO,IACzCnO,MAAK,SAAAC,GAAY,SAAKmP,aAAanP,EAASC,UAG7C,YAAAgP,aAAR,sBACItQ,KAAK6O,YAAa,EAClB,IAAMrO,EAAM,EAAAM,UAAUd,KAAKF,QAAS,SAC9BwB,EAAO,CACTsP,WAAY,gBACZC,cAAe7Q,KAAKY,MAAMiQ,eAExBtB,EAAc,EAAAC,iBACpB,OAAO,UACFjO,KAAKf,EAAKiP,EAAGC,UAAUpO,GAAO,CAAEP,QAASwO,IACzCnO,MAAK,SAAAC,GAAY,SAAKmP,aAAanP,EAASC,UAO7C,YAAAiP,SAAR,SAAiBN,GAAjB,WACUa,EACFb,EAAsBC,KAAKtE,MAAQ,KACjCmF,EAAiB,WAAM,SAAKzB,mBAAkB,IAEhDwB,EAAU,EACV9Q,KAAK4O,YAActJ,WAAWyL,EAAgBD,GAE9CC,KAIA,YAAAlB,WAAR,WAC6B,OAArB7P,KAAK4O,cACLvJ,aAAarF,KAAK4O,aAClB5O,KAAK4O,YAAc,OAG/B,EA9JA,GAAa,EAAAvO,gB,mVCZb,cAsBA,SAAgB2Q,EAAaC,GACzB,OAAOC,OAAOC,UAAUF,GAAOA,EAAIG,WAAaH,EAAII,QAAQ,GAoChE,SAAgBC,EACZ7M,EACA8M,EACAhE,GAEA,OAAc,IAAV9I,EACO8I,EAAKa,cACR,CAAEC,GAAI,uBACN,CACIkD,KAAMhE,EAAKa,cAAc,CACrBC,GAAI,wBAAwBkD,EAAI,cAMzChE,EAAKa,cACR,CAAEC,GAAI,4BACN,CACI5J,MAAK,EACL8M,KAAMhE,EAAKa,cAAc,CAAEC,GAAI,wBAAwBkD,MAwGnE,SAASC,EAAqB7D,EAAgB8D,GAS1C,OAPAA,EAAiBA,EAAe9M,QAAQ,WAAY,IAGrC,UAAXgJ,IACA8D,EAAiBA,EAAe9M,QAAQ,IAAK,OAG1C8M,EA9LE,EAAAC,IAAM,KACN,EAAAC,IAAM,EAAAD,IAAM,EAAAA,IACZ,EAAAE,IAAM,EAAAF,IAAM,EAAAC,IAOzB,yBAA8BV,GAC1B,OAAIC,OAAOW,MAAMZ,GACNxF,OAAO,GAEXA,OAAOC,KAAKoG,MAAMb,KAO7B,iBAWA,2BAAgCc,EAAmBxE,GAC/C,GAAIwE,GAAa,EAAAH,IAAK,CAClB,IAAMI,EAAUhB,EAAae,EAAY,EAAAH,KACzC,OAAOrE,EAAKa,cAAc,CAAEC,GAAI,yBAA2B,CAAE5J,MAAOuN,IAGxE,GAAID,GAAa,EAAAJ,IAAK,CAClB,IAAMM,EAAUjB,EAAae,EAAY,EAAAJ,KACzC,OAAOpE,EAAKa,cAAc,CAAEC,GAAI,yBAA2B,CAAE5J,MAAOwN,IAGxE,GAAIF,GAAa,EAAAL,IAAK,CAClB,IAAMQ,EAAUlB,EAAae,EAAY,EAAAL,KACzC,OAAOnE,EAAKa,cAAc,CAAEC,GAAI,yBAA2B,CAAE5J,MAAOyN,IAGxE,OAAO3E,EAAKa,cAAc,CAAEC,GAAI,qBAAuB,CAAE5J,MAAOsN,KAUpE,8BAgCA,0BACII,EACAC,EACA7E,GAEA,IAAM8E,EAAW,UAAOA,SAASF,GAEjC,SAASG,EAAYf,GACjB,OAAOhE,EAAKa,cACR,CAAEC,GAAI,+BACN,CAAEkD,KAAMhE,EAAKa,cAAc,CAAEC,GAAI,wBAAwBkD,EAAI,cAIrE,SAASgB,EACL9N,EACA8M,GAEA,OAAO9M,EAAQ,EAAI,GAAK6M,EAA0B7M,EAAO8M,EAAMhE,GAGnE,SAASiF,EAAoBC,GACzB,OAAOA,EAAiB3H,QAAO,SAAArG,GAAS,OAAAA,KAAOuG,KAAK,MAGxD,OAAQoH,GACJ,IAAK,UACD,GAAIC,EAASK,YAAc,EACvB,OAAOJ,EAAY,WAEvB,MACJ,IAAK,UACD,GAAID,EAASM,YAAc,EACvB,OAAOL,EAAY,WAEvB,MACJ,IAAK,QACD,GAAID,EAASO,UAAY,EACrB,OAAON,EAAY,SAEvB,MACJ,IAAK,OACD,GAAID,EAASQ,SAAW,EACpB,OAAOP,EAAY,QAEvB,MACJ,IAAK,SACD,GAAID,EAASS,WAAa,EACtB,OAAOR,EAAY,UAEvB,MACJ,IAAK,QACD,GAAID,EAASU,UAAY,EACrB,OAAOT,EAAY,SAK/B,IAAMU,EAAkB,GAGxB,OADAA,EAAM/I,KAAKsI,EAAuBF,EAASY,QAAS,UAChC,UAAhBb,EACOI,EAAoBQ,IAG/BA,EAAM/I,KAAKsI,EAAuBF,EAASa,SAAU,WACjC,WAAhBd,EACOI,EAAoBQ,IAG/BA,EAAM/I,KAAKsI,EAAuBF,EAASc,OAAQ,SAC/B,SAAhBf,EACOI,EAAoBQ,IAG/BA,EAAM/I,KAAKsI,EAAuBF,EAASe,QAAS,UAChC,UAAhBhB,EACOI,EAAoBQ,IAG/BA,EAAM/I,KAAKsI,EAAuBF,EAASgB,UAAW,YAClC,YAAhBjB,GAIJY,EAAM/I,KAAKsI,EAAuBF,EAASiB,UAAW,YAH3Cd,EAAoBQ,QAsBnC,oCAAyCvF,EAAY8F,GACjD,IAAI5F,EAAS4F,EAEP/R,EAAU,CACZgS,KAFY,UAGZC,MAHY,UAIZC,IAJY,UAKZC,KAAiB,UAAXhG,EAAqB,UALf,UAMZiG,OANY,UAOZC,OAPY,WAehB,MALe,UAAXlG,IAEAA,EAAS,SAGN6D,EAAqB7D,EAAQF,EAAKqG,mBAAmBnG,EAAQnM,KAGxE,oCAAyCuS,EAAYR,GACjD,IAAI5F,EAAS4F,EAEP/R,EAAU,CACZmS,KAAiB,UAAXhG,EAAqB,UAFf,UAGZiG,OAHY,WAWhB,MALe,UAAXjG,IAEAA,EAAS,SAGN6D,EAAqB7D,EAAQoG,EAAKC,mBAAmBrG,EAAQnM,M,iCCtMxE,SAAgByS,EAAyBC,GAGrC,IAFA,IAAMxP,EAAS,IAAIyP,MACbC,EAAQF,EAAM/T,OACXkU,EAAI,EAAGA,EAAID,EAAOC,IACvB3P,EAAOuF,KAAKiK,EAAMG,IAGtB,OAAO3P,EAgBX,SAAS4P,EAAyBC,GAC9B,QAAIA,EAAKC,kBACaD,EAAKC,mBACNC,Y,2IAzDzB,8BAAmCC,GAC/B,IAAMR,EAAQQ,EAAaR,MACrBS,EAAQD,EAAaC,MAE3B,GAAIT,GAEA,IADA,IAAME,EAAQF,EAAM/T,OACXkU,EAAI,EAAGA,EAAID,EAAOC,IACvB,GAAIC,EAAyBJ,EAAMG,IAC/B,OAAO,OAOf,GAAqB,IAAjBM,EAAMxU,OACN,OAAO,EAIf,OAAO,GAGX,4CAAiDuU,GAC7C,IAAMR,EAAQQ,EAAaR,MACrBS,EAAQD,EAAaC,MAG3B,OAAOT,EAaX,SAA8CA,GAG1C,IAFA,IAAMxP,EAAS,IAAIyP,MACbC,EAAQF,EAAM/T,OACXkU,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC5B,IAAME,EAAOL,EAAMG,GACdC,EAAyBC,IAC1B7P,EAAOuF,KAAKsK,EAAKK,aAIzB,OAAOlQ,EAvBQmQ,CAAqCX,GAASD,EAAyBU,IAG1F,8B,uHC3BA,SAAgBG,IACZ,OAHiD,EAErD,UAIA,+BAAoCC,EAAYrP,M,wOCRhD,cACA,QACA,QAEA,OAmBA,UAXuD,SAAA1C,GACnD,OACI,wBAAC,EAAAgS,MAAK,CAACzO,QAAQ,SAASrD,UAAU,eAC9B,+BAAKA,UAAU,uBACVF,EAAMiS,UAAY,wBAAC,EAAAC,iBAAgB,CAAC7G,GAAIrL,EAAMiS,YAAgBjS,EAAMN,WAEtEM,EAAMmS,SAAW,+BAAKjS,UAAU,uBAAuBF,EAAMmS,Y,4LClB5E,cACA,QACA,QAEA,OAwBA,UAf2D,SAAAnS,GACvD,OACI,wBAAC,EAAAgS,MAAK,CAACzO,QAAQ,UAAUrD,UAAU,iBAC/B,+BAAKA,UAAU,yBACVF,EAAMiS,UACH,wBAAC,EAAAC,iBAAgB,CAAC7G,GAAIrL,EAAMiS,UAAWG,OAAQpS,EAAMqS,gBAErDrS,EAAa,WAGlBA,EAAMmS,SAAW,+BAAKjS,UAAU,yBAAyBF,EAAMmS,Y,4LCvB9E,cACA,QAGA,SAkBA,UAZ6E,SAAAnS,GAKzE,OACI,wBAAC,EAAAyD,OAAM,CAACF,QAASvD,EAAMuD,QAAShD,QALhB,WAChB4H,OAAOC,SAASC,KAAO,EAAAtB,oBAAoB/G,KAKtCA,EAAMG,Y,ioBCjBnB,cACA,OAUa,EAAAmS,mBAAiE,SAAAtS,GACpE,MAAwB,EAAAqB,SAAS,MAAhCkR,EAAO,KAAEC,EAAU,KAK1B,SAASC,IACDF,GACAlQ,aAAakQ,GAerB,OAnBA,EAAAG,WAAU,WAAM,OAAAD,KAoBZ,yBACInS,KAAK,OACLmB,MAAOzB,EAAMyB,MACbkR,SAVR,SAAsBvP,GAClB,IAAMwP,EAAWxP,EAAEyP,OAAOpR,MAC1BzB,EAAM8S,kBAAkBF,GAP5B,SAAwBA,GACpBH,IACAD,EAAWlQ,YAAW,WAAM,OAAAtC,EAAM+S,kBAAkBH,KAAW5S,EAAMgT,eAMrEC,CAAeL,IAQXM,YAAalT,EAAMmT,gB,qmBCpC/B,gBAEA,2BA4BA,OA3BW,YAAAC,SAAP,SAAgBC,EAAYC,GACxB,IAAMC,EAAKC,EAAMC,aAGjB,SAASC,EAAaC,GAClB,IAwBYC,EAxBNC,EAAWR,EAAKS,MAAMH,EAAQA,EAHtB,UAIRI,EAAYJ,EAJJ,SAMd,OAqBYC,EArBUC,EAsBvB,IAAItU,SAAqB,SAAA4C,GAC5B,IAAM6R,EAAK,IAAIC,WACfD,EAAGE,iBAAiB,QAAQ,WAAM,OAAA/R,EAAQ6R,EAAGG,WAC7CH,EAAGI,kBAAkBR,OAzBexV,MAAK,SAAA2M,GACjCwI,EAAGc,OAAOtJ,GAEV,IAAMuJ,EAAWP,EAAYV,EAAKkB,KAAOR,EAAYV,EAAKkB,KAE1D,OADAjB,WAAagB,GACNP,KAYf,OAAO,IAAIxU,SAAQ,SAAA4C,GAAW,OAR9B,SAASqS,EAAUb,EAAgBxR,GAC3BwR,GAAUN,EAAKkB,KACfpS,IAEAuR,EAAaC,GAAQvV,MAAK,SAAA2V,GAAa,OAAAS,EAAUT,EAAW5R,MAItCqS,CAAU,EAAGrS,MAAU/D,MAAK,WAAM,OAAAmV,EAAGkB,OAAO,WAElF,EA5BA,G,8hBCLA,IAKA,cACI,WAAY3X,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAoBhC,OAtBwC,OAKpC,YAAA2X,YAAA,SACI7K,EACAC,EACAC,EACAC,EACA2K,EACAC,GAEA,OAAO5X,KAAKO,IAA8B,WAAY,CAClDsM,KAAI,EACJC,QAAO,EACPC,UAAS,EACTC,cAAa,EACb2K,aAAY,EACZC,WAAU,KAGtB,EAtBA,CALA,OAKwC7U,YAA3B,EAAA8U,sB,ghBCLb,IAKA,cACI,WAAY/X,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KA0BhC,OA5BuC,OAK5B,YAAA+X,cAAP,SACIC,EACAC,EACAnL,EACAC,EACAC,EACAC,GAEA,YAPA,IAAA+K,MAAA,SACA,IAAAC,MAAA,SACA,IAAAnL,MAAA,QACA,IAAAC,MAAA,SACA,IAAAC,MAAA,aACA,IAAAC,MAAA,aAEOhN,KAAKO,IAAmC,UAAW,CACtDyF,KAAM+R,EACNE,KAAMD,EACNnL,KAAI,EACJC,QAAO,EACPC,UAAS,EACTC,cAAa,KAId,YAAAkL,iBAAP,SAAwB7J,GACd,MAAmBA,EAAG8J,MAAM,KAA3BC,EAAQ,KAAEH,EAAI,KACfI,EAAQJ,EAAO,aAAeK,mBAAmBL,GAAQ,GAC/D,OAAOjY,KAAKO,IAAuB,WAAW6X,EAAWC,IAEjE,EA5BA,CALA,OAKuCtV,YAA1B,EAAAwV,qB,qrBCLb,IAOA,cACI,WAAYzY,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KA0DhC,OA5DsC,OAK3B,YAAAyY,oBAAP,SACIJ,EACAK,EACAC,EACAC,GAEA,IAAMrX,EAAO,IAAIsX,SAKjB,OAJAtX,EAAKuX,OAAO,OAAQJ,GACpBnX,EAAKuX,OAAO,OAAQH,EAAStH,YAC7B9P,EAAKuX,OAAO,WAAYF,GAEjB3Y,KAAKuB,KACR,WAAW6W,EAAQ,8BACnB9W,IAID,YAAAwX,wBAAP,SACIV,EACAW,EACAzX,EACA0X,EACAC,EACA3C,EACA4C,GAEA,IA+B6BzU,EA/BvB1D,EAA+D,CACjE,iBA8ByB0D,EA9BoBuU,EA+B9C,SAASvU,EAAM0U,YAAW,IAAI1U,EAAM2U,UAAS,IAAI3U,EAAM4U,YA7BtDJ,IACAlY,EAAQ,eAAiBkY,GAE7B,IAAMzX,EAA6B,CAC/BmB,iBAAkB2T,EAClBxT,YAAaoW,aAAiB,EAAjBA,EAAmBtY,OAGpC,OAwBR,SAAqBoY,GACjB,OAAkC,IAA3BA,EAAaK,WAAmBL,EAAaI,YAAcJ,EAAaK,UAAY,EAzBnFC,CAAYN,KASZxX,EAAQqB,eAAiB,SAACT,GAAmB,OAAW,MAAXA,IARtCpC,KAAK0B,IACR,WAAW0W,EAAQ,sCAAsCW,EACzDzX,EACAP,EACAS,IAahB,EA5DA,CAPA,OAOsCuB,YAAzB,EAAAwW,oB,kaCPb,IAIA,cAEI,WAAYzZ,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAsBhC,OAzBwD,OAM7C,YAAAyZ,qBAAP,SACIC,EACAC,EACAX,EACAY,GAEA,IACIlZ,EAUJ,OALIA,GAFEiZ,aAAU,EAAVA,EAAYvZ,QAEL,CAAEsZ,KAAI,EAAEG,WAAYF,GAGpB,CAAED,KAAI,EAAEI,OAAQd,EAAQe,MAAOH,GAErC3Z,KAAKO,IAXO,mBAW6BE,IAExD,EAzBA,CAJA,OAIwDsC,Y,8hBCJxD,IAIA,cACI,WAAYjD,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAgChC,OAlCwC,OAKpC,YAAAga,YAAA,SACIC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,IAAM/Y,EAAO,IAAIsX,SAmBjB,OAlBAtX,EAAKuX,OAAO,yBAA0BmB,EAAyB,IAAM,KAEjEC,GACA3Y,EAAKuX,OAAO,WAAYoB,EAAUA,EAASjU,MAG3CoU,EACA9Y,EAAKuX,OAAO,iBAAkB,KACvBqB,GACP5Y,EAAKuX,OAAO,YAAaqB,EAAWA,EAAUlU,MAG9CqU,EACA/Y,EAAKuX,OAAO,sBAAuB,KAC5BsB,GACP7Y,EAAKuX,OAAO,iBAAkBsB,EAAgBA,EAAenU,MAG1DhG,KAAKuB,KAAqB,kCAAmCD,IAE5E,EAlCA,CAJA,OAIwCyB,YAA3B,EAAAuX,sB,sKCJb,cACA,WAEA,OAgBA,UATyD,SAAAtX,GACrD,OACI,+BAAKE,UAAW,UAAW,yBAA0BF,EAAME,YACvD,8BAAIA,UAAU,gDAAgDF,EAAMuX,WACnEvX,EAAMG,Y,gSCdnB,cACA,WAEA,OAQa,EAAAqX,yBAA6E,SAAC,G,IACvFjT,EAAK,QACLrE,EAAS,YACTuX,EAAW,cAEX,OACI,+BAAKvX,UAAW,UAAW,sBAAuBA,IAC9C,gCAAMA,UAAU,6BAA6BuX,GAC7C,+BAAKvX,UAAU,uBAAuBqE,M,2NCnBlD,cACA,WAQa,EAAAmT,sBAAuE,SAAC,G,IACjFnT,EAAK,QACLrE,EAAS,YACTyX,EAAa,gBAEb,OACI,+BAAKzX,UAAW,UAAW,sBAAuBA,IAC9C,gCAAMA,UAAWyX,EAAa,mBAC9B,+BAAKzX,UAAU,uBAAuBqE,M,0MCjBlD,cACA,WACA,QAEA,OAWa,EAAAqT,2BAAiF,SAAC,G,IAC3FrT,EAAK,QACLsT,EAAQ,WACR3X,EAAS,YACT4X,EAAe,kBACfH,EAAa,gBACbjV,EAAM,SAEN,OACI,+BAAKxC,UAAW,UAAW,sBAAuBA,IAC9C,wBAAC,EAAA8R,MAAK,CAACzO,QAASuU,EAAiB5X,UAAU,2BACvC,+BAAKA,UAAU,qDACX,oCACI,6BAAGA,UAAWyX,EAAa,mBAC1BpT,IACEsT,GACC,gCAAM3X,UAAU,oCAAoC2X,OAI7DnV,GAAU,+BAAKxC,UAAU,8BAA8BwC,O,+vBCnC1E,cACA,SACA,YACA,YACA,YACA,WA8CA,UAhCuF,SAAC,GACpF,IAAApC,EAAI,OACJJ,EAAS,YACT0D,EAAK,QACLmU,EAAO,UACJ/X,EAAK,IAL4E,wCAO9E,EAAgB,EAAAgY,SAAShY,GAAxB+C,EAAK,KAAEkV,EAAI,KAEZC,EAAqBD,EAAK9Y,QAAU4Y,GAAWE,EAAKE,SAE1D,OACI,wBAAC,UAAS,CAACjY,UAAW,UAAGA,IACrB,wBAAC,UAAS,CAACkY,QAASpY,EAAMgD,MAAOY,GACjC,qCACQb,EACA/C,EAAK,CACTM,KAAMA,EACN+K,GAAIrL,EAAMgD,KACV9C,UAAW,UAAG,eAAgB,CAC1B,aAAcgY,OAGrBA,GACG,wBAAC,UAAYG,SAAQ,eAAc,UAAUrY,EAAMgD,KAAQ1C,KAAK,WAC3D2X,EAAK9Y,OAAS,O,wbC5CnC,IASA,cACI,WAAYrC,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KA4FhC,OA9F4C,OAKjC,YAAAub,cAAP,SACIC,EACA1O,EACAC,EACAC,EACAC,GAEA,YALA,IAAAH,MAAA,QACA,IAAAC,MAAA,SAEA,IAAAE,MAAA,cAEOhN,KAAKO,IACRP,KAAKwb,QAAQD,EAAO,SACpB,CACI1O,KAAI,EACJC,QAAO,EACPC,UAAS,EACTC,cAAa,IAEjB,IAID,YAAAyO,yBAAP,SAAgCF,GAC5B,OAAOvb,KAAKuB,KACRvB,KAAKwb,QAAQD,EAAO,2BACpB,KAID,YAAAG,0BAAP,SAAiCH,GAC7B,OAAOvb,KAAK2B,OAAa3B,KAAKwb,QAAQD,EAAO,6BAG1C,YAAAI,yBAAP,SAAgCJ,GAC5B,OAAOvb,KAAKO,IACRP,KAAKwb,QAAQD,EAAO,oBACpB,IACA,IAID,YAAAK,8BAAP,SAAqCL,EAAeM,GAChD,OAAO7b,KAAKuB,KAAWvB,KAAKwb,QAAQD,EAAO,oBAAqB,CAAEM,WAAU,KAGzE,YAAAC,uBAAP,SAA8BP,GAC1B,OAAOvb,KAAKO,IAAmBP,KAAKwb,QAAQD,EAAO,kBAAmB,IAAI,IAGvE,YAAAQ,uBAAP,SAA8BR,EAAeS,GACzC,OAAOhc,KAAKuB,KAAoBvB,KAAKwb,QAAQD,EAAO,kBAAmB,CAAES,aAAY,KAGlF,YAAAC,iBAAP,SACIV,EACAM,EACAK,GAEA,OAAOlc,KAAKuB,KAA6BvB,KAAKwb,QAAQD,EAAO,kBAAmB,CAC5EM,WAAU,EACVK,SAAQ,KAIT,YAAAC,iBAAP,SAAwBZ,GACpB,OAAOvb,KAAKuB,KAA6BvB,KAAKwb,QAAQD,EAAO,wBAAyB,KAGnF,YAAAa,kBAAP,SAAyBb,GACrB,OAAOvb,KAAKuB,KAA6BvB,KAAKwb,QAAQD,EAAO,yBAA0B,KAGpF,YAAAc,uBAAP,SACId,EACAW,GAEA,OAAOlc,KAAKuB,KAA6BvB,KAAKwb,QAAQD,EAAO,2BAA4B,CACrFW,SAAQ,KAIT,YAAAI,qBAAP,SAA4Bf,GACxB,OAAOvb,KAAKO,IAA4BP,KAAKwb,QAAQD,EAAO,kBAAmB,IAAI,IAGhF,YAAAgB,wBAAP,SAA+BhB,GAC3B,OAAOvb,KAAK2B,OAAa3B,KAAKwb,QAAQD,EAAO,oBAGzC,YAAAC,QAAR,SAAgBD,EAAeiB,GAC3B,MAAO,iBAAiBjB,EAAQiB,GAExC,EA9FA,CATA,OAS4CzZ,Y,+FCR5C,aAEA,aAII,WAA6B0Z,EAAmCC,GAAnC,KAAAD,WAAmC,KAAAC,eAF/C,KAAA5c,QAAU,oCAO/B,OAHW,YAAA6c,WAAP,SAAkBC,GACd,OAAU5c,KAAKF,QAAO,WAAW,EAAAuH,qBAAoB,SAASrH,KAAKyc,SAAQ,IAAIzc,KAAK0c,aAAY,IAAIE,EAAQ,QAEpH,EATA,G,qdCDA,IAGA,cAEI,WAAY9c,EAAiBC,G,OACzB,YAAMD,EAASC,IAAS,KAoBhC,OAvBkD,OAMvC,YAAA8c,2BAAP,SACI9D,EACA+D,GAEA,OAAO9c,KAAKuB,KAA8B,SAASwX,EAAM,eAAgB+D,IAGtE,YAAAC,kBAAP,SACIhE,EACAiE,GAEA,OAAOhd,KAAKO,IAAI,SAASwY,EAAM,gBAAgBiE,IAG5C,YAAAC,iBAAP,SAAwBlE,EAAgBiE,GACpC,OAAOhd,KAAK2B,OAAO,SAASoX,EAAM,gBAAgBiE,IAE1D,EAvBA,CAHA,OAGkDja,YAArC,EAAAma","file":"shared.rbundle.js","sourcesContent":["export * from \"./formattingUtils\";\r\nexport * from \"./fileUtils\";\r\nexport * from \"./componentUtils\";\r\nexport * from \"./debugUtils\";\r\nexport * from \"./applicationUtils\";\r\n","export { default as Control } from \"./Control\";\r\nexport { default as LabelledControl } from \"./LabelledControl\";\r\nexport { default as LabelledProgressBar } from \"./LabelledProgressBar\";\r\nexport { default as CommonModalHeaderControls } from \"./CommonModalHeaderControls\";\r\nexport { default as CommonModalFooterControls, ButtonProps } from \"./CommonModalFooterControls\";\r\nexport { default as ErrorAlert } from \"./ErrorAlert\";\r\nexport { default as WarningAlert } from \"./WarningAlert\";\r\nexport { default as ApplicationLinkButton } from \"./ApplicationLinkButton\";\r\nexport * from \"./DebouncedTextInput\";\r\nexport * from \"./WaitIndicator\";\r\n","export * from \"./ApiService\";\r\nexport * from \"./IApiService\";\r\nexport * from \"./ContactsApiService\";\r\nexport * from \"./IContactsApiService\";\r\nexport * from \"./FoldersApiService\";\r\nexport * from \"./IFoldersApiService\";\r\nexport * from \"./UsersApiService\";\r\nexport * from \"./IUsersApiService\";\r\nexport * from \"./IUploadApiService\";\r\nexport * from \"./UploadApiService\";\r\nexport { default as IDownloadValidateApiService } from \"./IDownloadValidateApiService\";\r\nexport { default as DownloadValidateApiService } from \"./DownloadValidateApiService\";\r\nexport * from \"./ISettingsApiService\";\r\nexport * from \"./SettingsApiService\";\r\n","import axios, { AxiosError, AxiosRequestConfig } from \"axios\";\r\n\r\nimport { IApiService, ApiRequestOptions } from \"./IApiService\";\r\nimport { TokenService } from \"./TokenService\";\r\nimport { ITokenService } from \"./ITokenService\";\r\nimport { Token } from \"./Token\";\r\nimport { getApiUrl, getTokenHeaders, getNoCacheHeaders } from \"../commUtil\";\r\n\r\ninterface ApiError {\r\n title: string;\r\n errorCode: number;\r\n detail: string;\r\n}\r\n\r\nfunction isString(object: any): boolean {\r\n return typeof object === \"string\";\r\n}\r\n\r\nfunction isApiError(object: any): object is ApiError {\r\n return object && !isString(object) && \"detail\" in object;\r\n}\r\n\r\nexport class ApiService implements IApiService {\r\n private readonly baseUrl: string = \"\";\r\n private readonly tokenService: ITokenService;\r\n\r\n constructor(baseUrl: string, language: string = \"\") {\r\n this.baseUrl = baseUrl;\r\n\r\n if (this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl = this.baseUrl.substr(0, this.baseUrl.length - 1);\r\n }\r\n\r\n this.tokenService = TokenService.getInstance(baseUrl, language);\r\n }\r\n\r\n public get(url: string, params?: object, preventCache?: boolean): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n const headers = Object.assign(\r\n {},\r\n getTokenHeaders(token),\r\n preventCache ? getNoCacheHeaders() : {}\r\n );\r\n return axios.get(fullUrl, { headers, params }).then(response => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public post(\r\n url: string,\r\n data: any,\r\n headers?: object,\r\n options?: ApiRequestOptions\r\n ): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, getTokenHeaders(token), headers);\r\n return axios\r\n .post(fullUrl, data, getAxiosRequestConfig(headers, options))\r\n .then(response => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public put(\r\n url: string,\r\n data: any,\r\n headers?: object,\r\n options?: ApiRequestOptions\r\n ): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, getTokenHeaders(token), headers);\r\n return axios\r\n .put(fullUrl, data, getAxiosRequestConfig(headers, options))\r\n .then(response => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public delete(url: string, headers?: object, options?: ApiRequestOptions): Promise {\r\n const doRequest = (token: Token): Promise => {\r\n const fullUrl = getApiUrl(this.baseUrl, url);\r\n headers = Object.assign({}, getTokenHeaders(token), headers);\r\n return axios\r\n .delete(fullUrl, getAxiosRequestConfig(headers, options))\r\n .then(response => response.data as T);\r\n };\r\n\r\n return this.doRequestWithToken(doRequest);\r\n }\r\n\r\n public signOut(): Promise {\r\n return this.tokenService.revokeToken();\r\n }\r\n\r\n private doRequestWithToken(requestFn: (token: Token) => Promise): Promise {\r\n const getTokenAndExecuteRequest = (forceRefresh: boolean): Promise => {\r\n return this.tokenService.getToken(forceRefresh).then(requestFn);\r\n };\r\n\r\n const handleError = (error: AxiosError): Promise => {\r\n if (error.response) {\r\n if (error.response.status === 401) {\r\n // This error typically means that our current token, while unexpired, has\r\n // become invalid, maybe because the server was restarted. Try refreshing\r\n // the token. If that doesn't work, a new token will be requested.\r\n return getTokenAndExecuteRequest(true);\r\n }\r\n\r\n // If we don't recognize the error, pass it on for higher level handling.\r\n if (isApiError(error.response.data)) {\r\n return Promise.reject((error.response.data as ApiError).detail);\r\n }\r\n }\r\n\r\n // If we can't get any specific detail from the error, reject with the error message,\r\n // or failing that, the error itself.\r\n return Promise.reject(error.message || error);\r\n };\r\n\r\n return getTokenAndExecuteRequest(false).catch(handleError);\r\n }\r\n}\r\n\r\nfunction getAxiosRequestConfig(headers?: object, options?: ApiRequestOptions): AxiosRequestConfig {\r\n return {\r\n headers,\r\n onUploadProgress: (options && options.onUploadProgress) || axios.defaults.onUploadProgress,\r\n validateStatus: (options && options.validateStatus) || axios.defaults.validateStatus,\r\n cancelToken: (options && options.cancelToken) || axios.defaults.cancelToken,\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./Control.scss\";\r\n\r\ninterface ControlProps {\r\n className?: string;\r\n}\r\n\r\nconst Control: FunctionComponent = props => {\r\n const classes = classNames(\"mi-react-control\", props.className);\r\n\r\n return
{props.children}
;\r\n};\r\n\r\nexport default Control;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\n\r\ninterface CommonModalHeaderControlsProps {\r\n close?: boolean;\r\n onClose?: () => void;\r\n help?: boolean;\r\n onHelp?: () => void;\r\n}\r\n\r\nconst CommonModalHeaderControls: FunctionComponent = props => {\r\n const helpButton = props.help ? (\r\n \r\n ) : null;\r\n\r\n const closeButton = props.close ? (\r\n \r\n \r\n \r\n ) : null;\r\n\r\n return (\r\n
\r\n {helpButton}\r\n {closeButton}\r\n
\r\n );\r\n};\r\n\r\nexport default CommonModalHeaderControls;\r\n","import React, { FunctionComponent, ReactElement } from \"react\";\r\nimport classnames from \"classnames\";\r\n\r\nimport \"./FeatureGroup.scss\";\r\n\r\nexport const FeatureGroupContent: FunctionComponent<{}> = ({ children }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport interface FeatureGroupProps {\r\n className?: string;\r\n}\r\n\r\nconst FeatureGroup: FunctionComponent = ({ className, children }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport default FeatureGroup;\r\nexport * from \"./FeatureGroupNumericTitle\";\r\nexport * from \"./FeatureGroupIconTitle\";\r\nexport * from \"./FeatureGroupBoxedIconTitle\";\r\n","import React, { useState } from \"react\";\r\n\r\nexport const useToggle = (\r\n initial: boolean = false\r\n): [boolean, () => void, React.Dispatch>] => {\r\n const [flag, setFlag] = useState(initial);\r\n const toggleFlag = () => setFlag(!flag);\r\n return [flag, toggleFlag, setFlag];\r\n};\r\nexport const useBoolean = (\r\n initial: boolean = false\r\n): [boolean, () => void, () => void, React.Dispatch>] => {\r\n const [flag, setFlag] = useState(initial);\r\n const setTrue = () => setFlag(true);\r\n const setFalse = () => setFlag(false);\r\n return [flag, setTrue, setFalse, setFlag];\r\n};\r\n\r\n/**\r\n * MOVEit Transfer uses underscores to separate sublanguages,\r\n * whereas react-intl requires dashes. Also, all language\r\n * codes should be lowercase.\r\n * @param value - the locale value given by the Transfer WebApp\r\n */\r\nexport function getLanguageCode(value: string): string {\r\n let output = value || \"en\";\r\n output = output.replace(\"_\", \"-\").toLowerCase();\r\n return output;\r\n}\r\n\r\n/**\r\n * A utility that returns a getter function for the latest value/ref to the given object (shallow comparison).\r\n * (Useful such as when an argument is a prop value and you want an async function to always use the most up-to-date value regardless of invocation time.)\r\n * @param obj the object whose latest reference you always want returned by the returned getter function\r\n * @returns a getter function that always returns the latest value/ref to the given object.\r\n *\r\n * Source: https://github.com/tannerlinsley/react-table/blob/aa2835766a7a34f70cd6b579628e4f7e820970ab/src/publicUtils.js#L140 (MIT License)\r\n */\r\nexport function useGetLatest(obj: T) {\r\n const ref = React.useRef();\r\n ref.current = obj;\r\n\r\n return React.useCallback(() => ref.current, []);\r\n}\r\n\r\n/**\r\n * Debounces a given function for a given timespan.\r\n * @param defaultFn\r\n * @param defaultWait\r\n *\r\n * Source: https://github.com/tannerlinsley/react-table/blob/aa2835766a7a34f70cd6b579628e4f7e820970ab/src/publicUtils.js#L163 (MIT License)\r\n */\r\nexport function useAsyncDebounce any>(\r\n defaultFn: T,\r\n defaultWait: number\r\n): T {\r\n const debounceRef = React.useRef<{\r\n promise?: Promise;\r\n resolve?: (value: T | PromiseLike) => void;\r\n reject?: (reason?: any) => void;\r\n timeout?: NodeJS.Timeout;\r\n }>({});\r\n\r\n // the given args could be props, which change, so we want to always use latest definitions.\r\n const getDefaultFn = useGetLatest(defaultFn);\r\n const getDefaultWait = useGetLatest(defaultWait);\r\n\r\n return React.useCallback(\r\n (async (...args) => {\r\n // make a promise\r\n if (!debounceRef.current.promise) {\r\n debounceRef.current.promise = new Promise((resolve, reject) => {\r\n debounceRef.current.resolve = resolve;\r\n debounceRef.current.reject = reject;\r\n });\r\n }\r\n\r\n if (debounceRef.current.timeout) {\r\n clearTimeout(debounceRef.current.timeout);\r\n }\r\n\r\n debounceRef.current.timeout = setTimeout(async () => {\r\n // Executing a debounced call--don't let it be canceled.\r\n delete debounceRef.current.timeout;\r\n try {\r\n debounceRef.current.resolve(await getDefaultFn()(...args));\r\n } catch (err) {\r\n debounceRef.current.reject(err);\r\n } finally {\r\n delete debounceRef.current.promise;\r\n }\r\n }, getDefaultWait());\r\n\r\n return debounceRef.current.promise;\r\n }) as T,\r\n [getDefaultFn, getDefaultWait]\r\n );\r\n}\r\n\r\nexport interface ISILTransactionArgs {\r\n [key: string]: string; // alows object to be indexed\r\n transaction: string; // required\r\n csrfToken: string; // required\r\n arg01?: string;\r\n arg02?: string;\r\n arg03?: string;\r\n arg04?: string;\r\n arg05?: string;\r\n arg06?: string;\r\n arg07?: string;\r\n arg08?: string;\r\n arg09?: string;\r\n arg10?: string;\r\n arg11?: string;\r\n arg12?: string;\r\n}\r\n// Taken and typified from post.jsskel :(\r\n// This function is called in the onclick handler of an anchor element that we\r\n// want to change to a POST dynamically.\r\n// Call like example: return postTransactionUrl({transaction: \"becoeinstadmin\", csfrToken: \"abcd123\", arg01: \"something\"})\r\nexport function postTransactionUrl(args: ISILTransactionArgs) {\r\n try {\r\n const form = document.createElement(\"form\") as HTMLFormElement;\r\n form.action = \"human.aspx\";\r\n form.method = \"post\";\r\n Object.keys(args).forEach(argName => {\r\n const field = document.createElement(\"input\") as HTMLInputElement;\r\n field.type = \"hidden\";\r\n field.name = argName;\r\n field.value = args[argName] || \"\";\r\n form.appendChild(field);\r\n });\r\n document.body.appendChild(form);\r\n form.submit();\r\n } catch (e) {\r\n alert(\"Post Transaction Failed: \" + e);\r\n }\r\n return false;\r\n}\r\n","import React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface ButtonProps {\r\n label: string | JSX.Element;\r\n onClick: () => void;\r\n disable?: boolean;\r\n}\r\n\r\ninterface CommonModalFooterControlsProps {\r\n primary?: ButtonProps;\r\n secondary?: ButtonProps;\r\n cancel?: ButtonProps;\r\n}\r\n\r\nconst CommonModalFooterControls: FunctionComponent = props => {\r\n const primaryButton = props.primary ? makeButton(\"primary\", props.primary) : null;\r\n const secondaryButton = props.secondary ? makeButton(\"secondary\", props.secondary) : null;\r\n const cancelButton = props.cancel ? makeButton(\"link\", props.cancel, \"btn-cancel\") : null;\r\n\r\n return (\r\n \r\n {primaryButton}\r\n {secondaryButton}\r\n {cancelButton}\r\n \r\n );\r\n};\r\n\r\nfunction makeButton(\r\n variant: \"primary\" | \"secondary\" | \"link\",\r\n props: ButtonProps,\r\n additionalClasses?: string\r\n): JSX.Element {\r\n return (\r\n \r\n {props.label}\r\n \r\n );\r\n}\r\n\r\nexport default CommonModalFooterControls;\r\n","export const DEBOUNCE_INTERVAL = 500; // milliseconds\r\nexport const TRANSFER_DOC_VERSION = \"2022\"; // if changing this value be sure to change it in /skels/utility.xslskel and in mi-dmz/libs/MOVEit.DMZ.Core/Constants.cs as well\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\n\r\nimport Control from \"./Control\";\r\n\r\nimport \"./LabelledControl.scss\";\r\n\r\ninterface LabelledControlProps {\r\n label: string;\r\n}\r\n\r\nconst LabelledControl: FunctionComponent = props => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LabelledControl;\r\n","import React, { FunctionComponent, ReactElement, useMemo } from \"react\";\r\n\r\nimport { useBoolean } from \"../utils/componentUtils\";\r\n\r\nexport interface WaitIndicatorProps {\r\n title: string;\r\n description: string;\r\n}\r\n\r\nexport const WaitIndicator: FunctionComponent = ({ title, description }) => {\r\n // NOTE: Styles for the classes used by this component are defined in commons-ui-styles\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{title}
\r\n
{description}
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Creates a wait element with methods to enable and disable it.\r\n */\r\nexport const useWaitIndicator = (\r\n title: string,\r\n description: string\r\n): [ReactElement, () => void, () => void] => {\r\n const [flag, setTrue, setFalse] = useBoolean(false);\r\n const waitElement = useMemo(\r\n () => ,\r\n []\r\n );\r\n\r\n return [flag ? waitElement : null, setTrue, setFalse];\r\n};\r\n\r\n/**\r\n * Creates a wait element with a method to display it while a provided\r\n * promise is active, and hide it when the promise settles.\r\n */\r\nexport const useWaitOnPromise = (\r\n title: string,\r\n description: string\r\n): [ReactElement, (promise: Promise) => void] => {\r\n const [waitElement, showWait, hideWait] = useWaitIndicator(title, description);\r\n\r\n const waitFunction = (promise: Promise): void => {\r\n showWait();\r\n promise.finally(hideWait);\r\n };\r\n\r\n return [waitElement, waitFunction];\r\n};\r\n","import React, { useMemo } from \"react\";\r\nimport { useTable, Column, UseTableOptions } from \"react-table\";\r\nimport cx from \"classnames\";\r\n\r\nimport \"./MITransferTable.scss\";\r\n\r\nexport interface MITransferTableProps extends UseTableOptions {\r\n caption?: string;\r\n className?: string;\r\n}\r\n\r\nconst MITransferTable = (props: MITransferTableProps) => {\r\n const columns: Column[] = useMemo(() => props.columns, [props.columns]);\r\n\r\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = useTable({\r\n ...props,\r\n columns,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n {// Loop over the header rows\r\n headerGroups.map((headerGroup, ind1) => (\r\n // Apply the header row props\r\n \r\n {// Loop over the headers in each row\r\n headerGroup.headers.map((column, ind2) => (\r\n // Apply the header cell props\r\n \r\n {// Render the header\r\n column.render(\"Header\")}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n {/* Apply the table body props */}\r\n \r\n {// Loop over the table rows\r\n rows.map((row, ind1) => {\r\n // Prepare the row for display\r\n prepareRow(row);\r\n return (\r\n // Apply the row props\r\n \r\n {// Loop over the rows cells\r\n row.cells.map((cell, ind2) => {\r\n // Apply the cell props\r\n return (\r\n \r\n {// Render the cell contents\r\n cell.render(\"Cell\")}\r\n \r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n
{props.caption}
\r\n );\r\n};\r\n\r\nexport default MITransferTable;\r\n","import { Token } from \"./services/Token\";\r\n\r\nexport function getApiUrl(baseUrl: string, relativeUrl: string): string {\r\n if (relativeUrl && !relativeUrl.startsWith(\"/\")) {\r\n relativeUrl = `/${relativeUrl}`;\r\n }\r\n\r\n return baseUrl + \"/api/v1\" + relativeUrl;\r\n}\r\n\r\nexport function getFormHeaders(): object {\r\n return { \"Content-Type\": \"application/x-www-form-urlencoded\" };\r\n}\r\n\r\nexport function getTokenHeaders(token: Token): object {\r\n return token ? { Authorization: `Bearer ${token.access_token}` } : {};\r\n}\r\n\r\n// Necessary to stop IE from caching repeated GET requests of non-static content\r\nexport function getNoCacheHeaders(): object {\r\n return { \"Cache-Control\": \"no-cache\", \"Pragma\": \"no-cache\", \"Expires\": 0 };\r\n}\r\n","export interface ApplicationLinkProps {\r\n arg01?: string;\r\n arg02?: string;\r\n arg03?: string;\r\n arg04?: string;\r\n arg05?: string;\r\n arg06?: string;\r\n arg07?: string;\r\n arg08?: string;\r\n arg09?: string;\r\n arg10?: string;\r\n arg11?: string;\r\n arg12?: string;\r\n}\r\n\r\nfunction makeLinkPart(name: string, value?: string): string {\r\n if (value) {\r\n return `${name}=${value}`;\r\n }\r\n}\r\n\r\nexport const makeApplicationLink = (props: ApplicationLinkProps): string => {\r\n const linkParts: string[] = [];\r\n\r\n linkParts.push(makeLinkPart(\"arg01\", props.arg01));\r\n linkParts.push(makeLinkPart(\"arg02\", props.arg02));\r\n linkParts.push(makeLinkPart(\"arg03\", props.arg03));\r\n linkParts.push(makeLinkPart(\"arg04\", props.arg04));\r\n linkParts.push(makeLinkPart(\"arg05\", props.arg05));\r\n linkParts.push(makeLinkPart(\"arg06\", props.arg06));\r\n linkParts.push(makeLinkPart(\"arg07\", props.arg07));\r\n linkParts.push(makeLinkPart(\"arg08\", props.arg08));\r\n linkParts.push(makeLinkPart(\"arg09\", props.arg09));\r\n linkParts.push(makeLinkPart(\"arg10\", props.arg10));\r\n linkParts.push(makeLinkPart(\"arg11\", props.arg11));\r\n linkParts.push(makeLinkPart(\"arg12\", props.arg12));\r\n\r\n return \"?\" + linkParts.filter(x => x).join(\"&\");\r\n};\r\n\r\nexport const navigateToApplicationLink = (props: ApplicationLinkProps): void => {\r\n const link = makeApplicationLink(props);\r\n window.location.href = link;\r\n};\r\n","import * as React from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport { ProgressBar, Row, Col } from \"react-bootstrap\";\r\n\r\nimport Control from \"./Control\";\r\n\r\nimport \"./LabelledProgressBar.scss\";\r\n\r\ninterface LabelledProgressBarProps {\r\n min: number;\r\n max: number;\r\n now: number;\r\n labelLeft: string;\r\n labelRight: string;\r\n}\r\n\r\nconst LabelledProgressBar: FunctionComponent = props => {\r\n const resolveLabel = (label: string): string => {\r\n return label.replace(/\\{(\\w+)\\}/, (match, group): string => {\r\n switch (group) {\r\n case \"percent\":\r\n return String(Math.round((props.now / props.max) * 100)) + \"%\";\r\n default:\r\n return \"\";\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n {resolveLabel(props.labelLeft)}\r\n \r\n \r\n {resolveLabel(props.labelRight)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default LabelledProgressBar;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport cn from \"classnames\";\r\n\r\nconst LoadingSpinner: FunctionComponent<{ classNames?: string }> = ({ classNames }) => (\r\n // NOTE: Styles for the classes used by this component are defined in commons-ui-styles\r\n
\r\n
\r\n
\r\n);\r\n\r\nexport default LoadingSpinner;\r\n","export { default as HashService } from \"./HashService\";\r\nexport { default as IHashService } from \"./IHashService\";\r\n","import { ApiService } from \".\";\r\nimport { IUsersApiService } from \"./IUsersApiService\";\r\nimport { UserDetailsModel } from \"../models/UserDetailsModel\";\r\nimport { SimpleUserModel } from \"../models/SimpleUserModel\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\n\r\nexport class UsersApiService extends ApiService implements IUsersApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getSelf(): Promise {\r\n return this.get(\"users/self\");\r\n }\r\n\r\n public getUserList(\r\n usernameFilter?: string,\r\n fullNameFilter?: string,\r\n emailFilter?: string,\r\n permissionFilter?:\r\n | \"EndUsers\"\r\n | \"Administrators\"\r\n | \"FileAdmins\"\r\n | \"GroupAdmins\"\r\n | \"TemporaryUsers\"\r\n | \"SysAdmins\",\r\n statusFilter?: \"ActiveUsers\" | \"InactiveUsers\" | \"NeverSignedOnUsers\" | \"TemplateUsers\",\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"username\" | \"fullname\" | \"email\" | \"lastLoginStamp\" = \"username\",\r\n sortDirection: \"ascending\" | \"descending\" = \"ascending\"\r\n ): Promise> {\r\n return this.get>(\"users\", {\r\n username: usernameFilter,\r\n fullName: fullNameFilter,\r\n email: emailFilter,\r\n permission: permissionFilter,\r\n status: statusFilter,\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n });\r\n }\r\n}\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./ContentSectionWrapper.scss\";\r\n\r\ninterface ContentSectionWrapperProps {\r\n sectionTitle: string;\r\n className?: string;\r\n}\r\n\r\nconst ContentSectionWrapper: FunctionComponent = props => {\r\n return (\r\n
\r\n

{props.sectionTitle}

\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default ContentSectionWrapper;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { useIntl } from \"react-intl\";\r\nimport { formatTransferLocaleDate } from \"../utils\";\r\n\r\ninterface FormattedLocaleDateProps {\r\n date: Date;\r\n locale?: string;\r\n className?: string; // will use a span if present\r\n}\r\n\r\nconst FormattedLocaleDate: FunctionComponent = props => {\r\n const intl = useIntl();\r\n const date = formatTransferLocaleDate(props.date, props.locale || intl.locale);\r\n return props.className ? {date} : <>{date};\r\n};\r\n\r\nexport default FormattedLocaleDate;\r\n","import React, { FunctionComponent, ReactElement } from \"react\";\r\nimport { useIntl } from \"react-intl\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./Beltline.scss\";\r\n\r\nexport interface BeltlineProps {\r\n children: ReactElement[];\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A heavily-styled family of flex components for displaying a wrapping row of related data fields and/or actions in a \"beltline\"\r\n * @param props\r\n */\r\nexport const Beltline: FunctionComponent = ({ children, className }) => {\r\n return
{children}
;\r\n};\r\n\r\nexport interface BeltineItemProps {\r\n label: {};\r\n content: {};\r\n labelClass?: string;\r\n contentClass?: string;\r\n className?: string;\r\n}\r\nexport const BeltlineItem: FunctionComponent = ({\r\n label,\r\n labelClass,\r\n content,\r\n contentClass,\r\n className,\r\n}) => {\r\n return (\r\n
\r\n {label}\r\n {content}\r\n
\r\n );\r\n};\r\n\r\nexport interface BeltlineItemQuantityProps {\r\n label: {};\r\n quantity: number | string | boolean | ReactElement;\r\n quantityTotal?: number | string | boolean | ReactElement;\r\n labelClass?: string;\r\n contentClass?: string;\r\n className?: string;\r\n}\r\nexport const BeltlineQuantity: FunctionComponent = ({\r\n label,\r\n labelClass,\r\n quantity,\r\n quantityTotal,\r\n contentClass,\r\n className,\r\n}) => {\r\n const intl = useIntl();\r\n const content = quantityTotal ? (\r\n intl.formatMessage(\r\n { id: \"common.unit.fraction\" },\r\n {\r\n part: {quantity},\r\n total: {quantityTotal},\r\n }\r\n )\r\n ) : (\r\n {quantity}\r\n );\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Beltline;\r\n","import { PackageRequirementsModel } from \"../models/PackageRequirementsModel\";\r\nimport { ApiService } from \"./ApiService\";\r\nimport { IPackagesApiService } from \"./IPackagesApiService\";\r\n\r\nexport class PackagesApiService extends ApiService implements IPackagesApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getPackageRequirements(): Promise {\r\n return this.get(\"packages/requirements\");\r\n }\r\n}\r\n","import axios from \"axios\";\r\nimport * as qs from \"qs\";\r\n\r\nimport { Token } from \"./Token\";\r\nimport { ITokenService } from \"./ITokenService\";\r\nimport { getApiUrl, getFormHeaders } from \"../commUtil\";\r\n\r\nconst SESSIONSTORAGEKEY_TOKEN = \"moveit.token\";\r\n/** Number of seconds prior to token expiration within which we should refresh the token. */\r\nconst TOKEN_REFRESH_THRESHOLD_SECONDS = 60;\r\n\r\nconst tokenServicePool: { [baseUrl: string]: ITokenService } = {};\r\n\r\nexport class TokenService implements ITokenService {\r\n /**\r\n * Returns an ITokenService instance for the given base URL.\r\n * Uses an instance pool such that two calls with the\r\n * same base URL argument will return the same instance.\r\n */\r\n public static getInstance(baseUrl: string, language: string) {\r\n if (!tokenServicePool[baseUrl]) {\r\n tokenServicePool[baseUrl] = new TokenService(baseUrl, language);\r\n }\r\n\r\n return tokenServicePool[baseUrl];\r\n }\r\n\r\n /**\r\n * Clears all entries from the instance pool.\r\n */\r\n public static resetPool() {\r\n const poolEntries = Object.getOwnPropertyNames(tokenServicePool);\r\n for (const entry of poolEntries) {\r\n delete tokenServicePool[entry];\r\n }\r\n }\r\n\r\n private readonly baseUrl: string = \"\";\r\n private readonly language: string = \"\";\r\n private token: Token = null;\r\n private tokenPromise: Promise = null;\r\n private timerHandle: any = null;\r\n private refreshing: boolean = false;\r\n\r\n private constructor(baseUrl: string, language: string) {\r\n this.baseUrl = baseUrl;\r\n this.language = language;\r\n\r\n const tokenString = sessionStorage.getItem(SESSIONSTORAGEKEY_TOKEN);\r\n if (tokenString) {\r\n this.token = JSON.parse(tokenString) as Token;\r\n // Do not start token reset timer until a token is actually requested\r\n //if (isValidToken(this.token)) {\r\n // this.setTimer(this.token.expirationTimestamp);\r\n //}\r\n }\r\n }\r\n\r\n public getToken(forceRefresh?: boolean): Promise {\r\n if ((forceRefresh && !this.refreshing) || !this.tokenPromise) {\r\n this.resetTokenPromise(forceRefresh);\r\n }\r\n\r\n return this.tokenPromise;\r\n }\r\n\r\n public revokeToken(): Promise {\r\n const url = getApiUrl(this.baseUrl, \"token/revoke\");\r\n const data = { token: this.token.access_token };\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then(() => this.clearToken());\r\n }\r\n\r\n public clearToken(): void {\r\n this.token = null;\r\n this.tokenPromise = null;\r\n sessionStorage.removeItem(SESSIONSTORAGEKEY_TOKEN);\r\n }\r\n\r\n private resetTokenPromise(forceRefresh: boolean): void {\r\n this.unsetTimer();\r\n this.tokenPromise = new Promise((resolve, reject) => {\r\n const doAcquire = (): void => {\r\n this.acquireToken().then(\r\n newToken => resolve(newToken),\r\n error => reject(error)\r\n );\r\n };\r\n\r\n const doRefresh = (): void => {\r\n this.refreshToken().then(\r\n newToken => resolve(newToken),\r\n () => doAcquire()\r\n );\r\n };\r\n\r\n if (isValidToken(this.token)) {\r\n if (forceRefresh || shouldRefreshToken(this.token)) {\r\n doRefresh();\r\n } else {\r\n // Set refresh timer if not already set\r\n if (!this.timerHandle) {\r\n this.setTimer(this.token.expirationTimestamp);\r\n }\r\n resolve(this.token);\r\n }\r\n } else {\r\n doAcquire();\r\n }\r\n });\r\n }\r\n\r\n private processToken(token: Token): Token {\r\n token.expirationTimestamp = calculateTokenExpirationTimestamp(token);\r\n sessionStorage.setItem(SESSIONSTORAGEKEY_TOKEN, JSON.stringify(token));\r\n this.setTimer(token.expirationTimestamp);\r\n this.token = token;\r\n this.refreshing = false; // reset refresh status\r\n return token;\r\n }\r\n\r\n private acquireToken(): Promise {\r\n const url = getApiUrl(this.baseUrl, \"token\");\r\n const data = {\r\n grant_type: \"session\",\r\n language: this.language,\r\n };\r\n\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then(response => this.processToken(response.data as Token));\r\n }\r\n\r\n private refreshToken(): Promise {\r\n this.refreshing = true; // don't let extra refresh requests go through\r\n const url = getApiUrl(this.baseUrl, \"token\");\r\n const data = {\r\n grant_type: \"refresh_token\",\r\n refresh_token: this.token.refresh_token,\r\n };\r\n const formHeaders = getFormHeaders();\r\n return axios\r\n .post(url, qs.stringify(data), { headers: formHeaders })\r\n .then(response => this.processToken(response.data as Token));\r\n }\r\n\r\n /**\r\n * Sets a timer that refreshes the token just after the refresh threshold\r\n * has been reached based on the provided token expiration timestamp.\r\n */\r\n private setTimer(expirationTimestamp: number): void {\r\n const dueTime =\r\n expirationTimestamp - Date.now() - (TOKEN_REFRESH_THRESHOLD_SECONDS - 1) * 1000;\r\n const executeRefresh = () => this.resetTokenPromise(false);\r\n\r\n if (dueTime > 0) {\r\n this.timerHandle = setTimeout(executeRefresh, dueTime);\r\n } else {\r\n executeRefresh();\r\n }\r\n }\r\n\r\n private unsetTimer(): void {\r\n if (this.timerHandle !== null) {\r\n clearTimeout(this.timerHandle);\r\n this.timerHandle = null;\r\n }\r\n }\r\n}\r\n\r\nfunction isValidToken(token: Token): boolean {\r\n return !!token && !isExpiredToken(token);\r\n}\r\n\r\nfunction isExpiredToken(token: Token): boolean {\r\n return token.expirationTimestamp <= Date.now();\r\n}\r\n\r\nfunction shouldRefreshToken(token: Token): boolean {\r\n return token.expirationTimestamp - Date.now() < TOKEN_REFRESH_THRESHOLD_SECONDS * 1000;\r\n}\r\n\r\nfunction calculateTokenExpirationTimestamp(token: Token): number {\r\n return Date.now() + token.expires_in * 1000;\r\n}\r\n","import { IntlShape } from \"react-intl\";\r\nimport moment from \"moment\";\r\n\r\nexport const KiB = 1024;\r\nexport const MiB = KiB * KiB;\r\nexport const GiB = KiB * MiB;\r\n\r\n/**\r\n * Checks for valid input and returns 0 if invalid.\r\n * Returns the floor of the number, to make sure we don't report 100%\r\n * if value is less than 100.\r\n */\r\nexport function formatPercent(num: number): string {\r\n if (Number.isNaN(num)) {\r\n return String(0);\r\n }\r\n return String(Math.floor(num));\r\n}\r\n\r\n/**\r\n * Returns the number if it is whole, or the number rounded to a single\r\n * decimal point if it is not whole, as a string.\r\n */\r\nexport function formatNumber(num: number): string {\r\n return Number.isInteger(num) ? num.toString() : num.toFixed(1);\r\n}\r\n\r\n/**\r\n * Returns a formatted bytecount with the appropriate translated unit\r\n * string appended.\r\n *\r\n * @param bytecount Bytecount to format.\r\n * @param intl Internationalization service object from react-intl.\r\n */\r\nexport function formatBytecount(bytecount: number, intl: IntlShape): string {\r\n if (bytecount >= GiB) {\r\n const gbCount = formatNumber(bytecount / GiB);\r\n return intl.formatMessage({ id: \"common.unit.gigabytes\" }, { value: gbCount });\r\n }\r\n\r\n if (bytecount >= MiB) {\r\n const mbCount = formatNumber(bytecount / MiB);\r\n return intl.formatMessage({ id: \"common.unit.megabytes\" }, { value: mbCount });\r\n }\r\n\r\n if (bytecount >= KiB) {\r\n const kbCount = formatNumber(bytecount / KiB);\r\n return intl.formatMessage({ id: \"common.unit.kilobytes\" }, { value: kbCount });\r\n }\r\n\r\n return intl.formatMessage({ id: \"common.unit.bytes\" }, { value: bytecount });\r\n}\r\n\r\n/**\r\n * Returns a simple formatted duration string with the provided value and unit string.\r\n *\r\n * @param value Value to display\r\n * @param unit Unit to display\r\n * @param intl Internationalization service object from react-intl\r\n */\r\nexport function formatDurationDescription(\r\n value: number,\r\n unit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\",\r\n intl: IntlShape\r\n): string {\r\n if (value === 1) {\r\n return intl.formatMessage(\r\n { id: \"common.duration.one\" },\r\n {\r\n unit: intl.formatMessage({\r\n id: `common.duration.unit.${unit}.single`,\r\n }),\r\n }\r\n );\r\n }\r\n\r\n return intl.formatMessage(\r\n { id: \"common.duration.multiple\" },\r\n {\r\n value,\r\n unit: intl.formatMessage({ id: `common.duration.unit.${unit}` }),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Returns a formatted duration value with the appropriate translated units.\r\n *\r\n * @param milliseconds Length of duration\r\n * @param minimumUnit Smallest unit to include in resulting string\r\n * @param intl Internationalization service object from react-intl\r\n */\r\nexport function formatDuration(\r\n milliseconds: number,\r\n minimumUnit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\",\r\n intl: IntlShape\r\n): string {\r\n const duration = moment.duration(milliseconds);\r\n\r\n function lessThanOne(unit: string): string {\r\n return intl.formatMessage(\r\n { id: \"common.duration.lessThanOne\" },\r\n { unit: intl.formatMessage({ id: `common.duration.unit.${unit}.single` }) }\r\n );\r\n }\r\n\r\n function getDurationDescription(\r\n value: number,\r\n unit: \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"years\"\r\n ): string {\r\n return value < 1 ? \"\" : formatDurationDescription(value, unit, intl);\r\n }\r\n\r\n function assembleDescription(descriptionParts: string[]): string {\r\n return descriptionParts.filter(value => value).join(\", \");\r\n }\r\n\r\n switch (minimumUnit) {\r\n case \"seconds\":\r\n if (duration.asSeconds() < 1) {\r\n return lessThanOne(\"seconds\");\r\n }\r\n break;\r\n case \"minutes\":\r\n if (duration.asMinutes() < 1) {\r\n return lessThanOne(\"minutes\");\r\n }\r\n break;\r\n case \"hours\":\r\n if (duration.asHours() < 1) {\r\n return lessThanOne(\"hours\");\r\n }\r\n break;\r\n case \"days\":\r\n if (duration.asDays() < 1) {\r\n return lessThanOne(\"days\");\r\n }\r\n break;\r\n case \"months\":\r\n if (duration.asMonths() < 1) {\r\n return lessThanOne(\"months\");\r\n }\r\n break;\r\n case \"years\":\r\n if (duration.asYears() < 1) {\r\n return lessThanOne(\"years\");\r\n }\r\n break;\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n parts.push(getDurationDescription(duration.years(), \"years\"));\r\n if (minimumUnit === \"years\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.months(), \"months\"));\r\n if (minimumUnit === \"months\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.days(), \"days\"));\r\n if (minimumUnit === \"days\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.hours(), \"hours\"));\r\n if (minimumUnit === \"hours\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.minutes(), \"minutes\"));\r\n if (minimumUnit === \"minutes\") {\r\n return assembleDescription(parts);\r\n }\r\n\r\n parts.push(getDurationDescription(duration.seconds(), \"seconds\"));\r\n return assembleDescription(parts);\r\n}\r\n\r\n// Adjusts a formatted datetime string to match MOVEit Transfer's existing datetime formatting\r\n// for various locales; these account for differences between .NET datetime formatting and\r\n// javascript datetime formatting.\r\nfunction adjustDateTimeString(locale: string, dateTimeString: string): string {\r\n // Remove commas and French à character\r\n dateTimeString = dateTimeString.replace(/,| (?:à)/, \"\");\r\n\r\n // Add space after character for Taiwanese\r\n if (locale === \"zh-TW\") {\r\n dateTimeString = dateTimeString.replace(/午/, \"午 \");\r\n }\r\n\r\n return dateTimeString;\r\n}\r\n\r\nexport function formatTransferLocaleDate(date: Date, intlLocale: string): string {\r\n let locale = intlLocale;\r\n const NUMERIC = \"numeric\";\r\n const options = {\r\n year: NUMERIC,\r\n month: NUMERIC,\r\n day: NUMERIC,\r\n hour: locale === \"zh-TW\" ? \"2-digit\" : NUMERIC, // zh-TW uses 12 hour time, but two digit hours\r\n minute: NUMERIC,\r\n second: NUMERIC,\r\n };\r\n\r\n if (locale === \"zh-CN\") {\r\n // Chinese-Simple should have same format as Japanese\r\n locale = \"ja-JP\";\r\n }\r\n\r\n return adjustDateTimeString(locale, date.toLocaleDateString(locale, options));\r\n}\r\n\r\nexport function formatTransferLocaleTime(time: Date, intlLocale: string): string {\r\n let locale = intlLocale;\r\n const NUMERIC = \"numeric\";\r\n const options = {\r\n hour: locale === \"zh-TW\" ? \"2-digit\" : NUMERIC, // zh-TW uses 12 hour time, but two digit hours\r\n minute: NUMERIC,\r\n };\r\n\r\n if (locale === \"zh-CN\") {\r\n // Chinese-Simple should have same format as Japanese\r\n locale = \"ja-JP\";\r\n }\r\n\r\n return adjustDateTimeString(locale, time.toLocaleTimeString(locale, options));\r\n}\r\n","export function foldersWereDropped(dataTransfer: DataTransfer): boolean {\r\n const items = dataTransfer.items;\r\n const files = dataTransfer.files;\r\n\r\n if (items) {\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n if (dataTransferItemIsFolder(items[i])) {\r\n return true;\r\n }\r\n }\r\n } else {\r\n // IE does not have an items collection on drag events,\r\n // and will return a zero-length files collection if\r\n // a folder was dropped.\r\n if (files.length === 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function getFileArrayFromDragDataTransfer(dataTransfer: DataTransfer): File[] {\r\n const items = dataTransfer.items;\r\n const files = dataTransfer.files;\r\n\r\n // IE will not have an items collection on drag events.\r\n return items ? getFileArrayFromDataTransferItemList(items) : getFileArrayFromFileList(files);\r\n}\r\n\r\nexport function getFileArrayFromFileList(items: FileList): File[] {\r\n const output = new Array();\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n output.push(items[i]);\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction getFileArrayFromDataTransferItemList(items: DataTransferItemList): File[] {\r\n const output = new Array();\r\n const count = items.length;\r\n for (let i = 0; i < count; i++) {\r\n const item = items[i];\r\n if (!dataTransferItemIsFolder(item)) {\r\n output.push(item.getAsFile());\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction dataTransferItemIsFolder(item: DataTransferItem): boolean {\r\n if (item.webkitGetAsEntry) {\r\n const entryItem = item.webkitGetAsEntry();\r\n return entryItem.isDirectory;\r\n }\r\n\r\n return false;\r\n}\r\n","import { Action } from \"../Action\";\r\n\r\nconst development: boolean = process.env.NODE_ENV && process.env.NODE_ENV === \"development\";\r\n\r\nexport function isDev(): boolean {\r\n return development;\r\n}\r\n\r\nexport function logDispatchedAction(state: any, action: Action): void {\r\n if (!isDev()) return;\r\n console.log(\r\n `\r\n%cAction Dispatched: %c%s\r\n%cCurrent State: %O\r\nPayload: %O\r\n `,\r\n \"font-weight: bold\",\r\n \"font-weight: bold; color: red;\",\r\n action.type,\r\n \"font-weight: normal\",\r\n state,\r\n action.payload\r\n );\r\n}\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./ErrorAlert.scss\";\r\n\r\ninterface ErrorAlertProps {\r\n messageId: string;\r\n message?: string;\r\n details?: string;\r\n}\r\n\r\nconst ErrorAlert: FunctionComponent = props => {\r\n return (\r\n \r\n
\r\n {props.messageId ? : props.message}\r\n
\r\n {!!props.details &&
{props.details}
}\r\n
\r\n );\r\n};\r\n\r\nexport default ErrorAlert;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./WarningAlert.scss\";\r\n\r\ninterface WarningAlertProps {\r\n messageId: string;\r\n messageValues?: {};\r\n message?: string;\r\n details?: string;\r\n}\r\n\r\nconst WarningAlert: FunctionComponent = props => {\r\n return (\r\n \r\n
\r\n {props.messageId ? (\r\n \r\n ) : (\r\n props.message\r\n )}\r\n
\r\n {!!props.details &&
{props.details}
}\r\n
\r\n );\r\n};\r\n\r\nexport default WarningAlert;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { ButtonVariant } from \"react-bootstrap/types\";\r\n\r\nimport { ApplicationLinkProps, makeApplicationLink } from \"../utils/applicationUtils\";\r\n\r\ninterface ApplicationLinkButtonProps extends ApplicationLinkProps {\r\n variant: ButtonVariant;\r\n}\r\n\r\nconst ApplicationLinkButton: FunctionComponent = props => {\r\n const handleClick = (): void => {\r\n window.location.href = makeApplicationLink(props);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ApplicationLinkButton;\r\n","import * as React from \"react\";\r\nimport { FunctionComponent, ChangeEvent, useState, useEffect } from \"react\";\r\n\r\nexport interface DebouncedTextInputProps {\r\n value: string;\r\n placeHolder: string;\r\n onImmediateChange: (value: string) => void;\r\n onDebouncedChange: (value: string) => void;\r\n debounceTime: number;\r\n}\r\n\r\nexport const DebouncedTextInput: FunctionComponent = props => {\r\n const [timerId, setTimerId] = useState(null);\r\n\r\n // Clear the timer when unmounted\r\n useEffect(() => clearTimer);\r\n\r\n function clearTimer() {\r\n if (timerId) {\r\n clearTimeout(timerId);\r\n }\r\n }\r\n\r\n function debounceChange(newValue: string) {\r\n clearTimer();\r\n setTimerId(setTimeout(() => props.onDebouncedChange(newValue), props.debounceTime));\r\n }\r\n\r\n function handleChange(e: ChangeEvent) {\r\n const newValue = e.target.value;\r\n props.onImmediateChange(newValue);\r\n debounceChange(newValue);\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import IHashService from \"./IHashService\";\r\n// Rusha has no TS types definition, so we need to ignore that in the compiler and just go with it\r\n//@ts-ignore\r\nimport * as Rusha from \"rusha\";\r\n\r\nexport default class HashService implements IHashService {\r\n public hashFile(file: File, onProgress?: (progress: number) => void): Promise {\r\n const md = Rusha.createHash();\r\n const chunksize = 10 * 1024 * 1024; // 10 MiB\r\n\r\n function hashNextPart(offset: number): Promise {\r\n const nextPart = file.slice(offset, offset + chunksize);\r\n const newOffset = offset + chunksize;\r\n\r\n return getBlobContent(nextPart).then(content => {\r\n md.update(content);\r\n // report progress\r\n const progress = newOffset < file.size ? newOffset : file.size;\r\n onProgress?.(progress);\r\n return newOffset;\r\n });\r\n }\r\n\r\n function hashParts(offset: number, resolve: () => void) {\r\n if (offset >= file.size) {\r\n resolve();\r\n } else {\r\n hashNextPart(offset).then(newOffset => hashParts(newOffset, resolve));\r\n }\r\n }\r\n\r\n return new Promise(resolve => hashParts(0, resolve)).then(() => md.digest(\"hex\"));\r\n }\r\n}\r\n\r\nfunction getBlobContent(blob: Blob): Promise {\r\n return new Promise(resolve => {\r\n const fr = new FileReader();\r\n fr.addEventListener(\"load\", () => resolve(fr.result as ArrayBuffer));\r\n fr.readAsArrayBuffer(blob);\r\n });\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport { IContactsApiService } from \"./IContactsApiService\";\r\nimport { ContactModel } from \"../models/ContactModel\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\n\r\nexport class ContactsApiService extends ApiService implements IContactsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n getContacts(\r\n page?: number,\r\n perPage?: number,\r\n sortField?: \"name\" | \"email\",\r\n sortDirection?: \"ascending\" | \"descending\",\r\n searchString?: string,\r\n onBehalfOf?: string\r\n ): Promise> {\r\n return this.get>(\"contacts\", {\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n searchString,\r\n onBehalfOf,\r\n });\r\n }\r\n}\r\n","import { ApiService } from \".\";\r\nimport { IFoldersApiService } from \"./IFoldersApiService\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\nimport { SimpleFolderModel } from \"../models/SimpleFolderModel\";\r\n\r\nexport class FoldersApiService extends ApiService implements IFoldersApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getFolderList(\r\n nameFilter: string = \"\",\r\n pathFilter: string = \"\",\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"Name\" | \"Type\" | \"Path\" = \"Path\",\r\n sortDirection: \"ascending\" | \"descending\" = \"ascending\"\r\n ): Promise> {\r\n return this.get>(\"folders\", {\r\n name: nameFilter,\r\n path: pathFilter,\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n });\r\n }\r\n\r\n public getFolderDetails(id: string): Promise {\r\n const [folderId, path] = id.split(\"-\");\r\n const param = path ? \"?pathhash=\" + encodeURIComponent(path) : \"\";\r\n return this.get(`folders/${folderId}${param}`);\r\n }\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport { IUploadApiService, ContentRange } from \"./IUploadApiService\";\r\nimport { SimpleFileModel } from \"../models/SimpleFileModel\";\r\nimport { FileUploadResponseModel } from \"../models/FileUploadResponseModel\";\r\nimport { ApiRequestOptions } from \"./IApiService\";\r\nimport axios, { CancelTokenSource } from \"axios\";\r\n\r\nexport class UploadApiService extends ApiService implements IUploadApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public initResumableUpload(\r\n folderId: string,\r\n fileName: string,\r\n fileSize: number,\r\n comments: string\r\n ): Promise {\r\n const data = new FormData();\r\n data.append(\"name\", fileName);\r\n data.append(\"size\", fileSize.toString());\r\n data.append(\"comments\", comments);\r\n\r\n return this.post(\r\n `folders/${folderId}/files?uploadType=resumable`,\r\n data\r\n );\r\n }\r\n\r\n public continueResumableUpload(\r\n folderId: string,\r\n fileId: string,\r\n data: Blob,\r\n contentRange: ContentRange,\r\n fileHash?: string,\r\n onProgress?: (e: ProgressEvent) => void,\r\n cancelTokenSource?: CancelTokenSource\r\n ): Promise {\r\n const headers: { \"Content-Range\": string; \"X-File-Hash\"?: string } = {\r\n \"Content-Range\": makeContentRangeHeaderValue(contentRange),\r\n };\r\n if (fileHash) {\r\n headers[\"X-File-Hash\"] = fileHash;\r\n }\r\n const options: ApiRequestOptions = {\r\n onUploadProgress: onProgress,\r\n cancelToken: cancelTokenSource?.token,\r\n };\r\n\r\n if (isLastChunk(contentRange)) {\r\n return this.put(\r\n `folders/${folderId}/files?uploadType=resumable&fileId=${fileId}`,\r\n data,\r\n headers,\r\n options\r\n );\r\n } else {\r\n // Non-final chunk uploads should return a 308 status on success\r\n options.validateStatus = (status: number) => status === 308;\r\n return this.put(\r\n `folders/${folderId}/files?uploadType=resumable&fileId=${fileId}`,\r\n data,\r\n headers,\r\n options\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction makeContentRangeHeaderValue(value: ContentRange): string {\r\n return `bytes ${value.startOffset}-${value.endOffset}/${value.totalSize}`;\r\n}\r\n\r\nfunction isLastChunk(contentRange: ContentRange): boolean {\r\n return contentRange.totalSize === 0 || contentRange.endOffset === contentRange.totalSize - 1;\r\n}\r\n","import { ApiService } from \"./ApiService\";\r\nimport IDownloadValidateApiService from \"./IDownloadValidateApiService\";\r\nimport ValidationResponse from \"../models/DownloadValidationResponseModel\";\r\n\r\nexport default class DownloadValidateApiService extends ApiService\r\n implements IDownloadValidateApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public validateDownloadHash(\r\n hash: string,\r\n downloadId?: string,\r\n fileId?: string,\r\n logId?: string\r\n ): Promise {\r\n const requestUrl = \"/downloads/check\";\r\n let params:\r\n | { hash: string; downloadid: string }\r\n | { hash: string; fileid: string; logid: string };\r\n if (!!downloadId?.length) {\r\n // use downloadId\r\n params = { hash, downloadid: downloadId };\r\n } else {\r\n // use fileId and logId\r\n params = { hash, fileid: fileId, logid: logId };\r\n }\r\n return this.get(requestUrl, params);\r\n }\r\n}\r\n","import { ApiService } from \".\";\r\nimport { ISettingsApiService } from \"./ISettingsApiService\";\r\nimport { LogosInfoModel } from \"../models/LogosInfoModel\";\r\n\r\nexport class SettingsApiService extends ApiService implements ISettingsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n updateLogos(\r\n useCustomNotifBranding: boolean,\r\n leftLogo?: File,\r\n rightLogo?: File,\r\n backgroundLogo?: File,\r\n resetRightLogo?: boolean,\r\n resetBackgroundLogo?: boolean\r\n ): Promise {\r\n const data = new FormData();\r\n data.append(\"useCustomNotifBranding\", useCustomNotifBranding ? \"1\" : \"0\");\r\n\r\n if (leftLogo) {\r\n data.append(\"leftLogo\", leftLogo, leftLogo.name);\r\n }\r\n\r\n if (resetRightLogo) {\r\n data.append(\"resetRightLogo\", \"1\");\r\n } else if (rightLogo) {\r\n data.append(\"rightLogo\", rightLogo, rightLogo.name);\r\n }\r\n\r\n if (resetBackgroundLogo) {\r\n data.append(\"resetBackgroundLogo\", \"1\");\r\n } else if (backgroundLogo) {\r\n data.append(\"backgroundLogo\", backgroundLogo, backgroundLogo.name);\r\n }\r\n\r\n return this.post(\"settings/appearance/brand/logos\", data);\r\n }\r\n}\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./PageWrapper.scss\";\r\n\r\ninterface PageWrapperProps {\r\n pageTitle: string;\r\n className?: string;\r\n}\r\n\r\nconst PageWrapper: FunctionComponent = props => {\r\n return (\r\n
\r\n

{props.pageTitle}

\r\n {props.children}\r\n
\r\n );\r\n};\r\n\r\nexport default PageWrapper;\r\n","import React, { FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nimport \"./FeatureGroupNumericTitle.scss\";\r\n\r\nexport interface FeatureGroupNumericTitleProps {\r\n title: string;\r\n className?: string;\r\n titleNumber: number;\r\n}\r\n\r\nexport const FeatureGroupNumericTitle: FunctionComponent = ({\r\n title,\r\n className,\r\n titleNumber,\r\n}) => {\r\n return (\r\n
\r\n {titleNumber}\r\n
{title}
\r\n
\r\n );\r\n};\r\n","import React, { ReactElement, FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface FeatureGroupIconTitleProps {\r\n title: string | ReactElement;\r\n className?: string;\r\n iconClassName: string;\r\n}\r\n\r\nexport const FeatureGroupIconTitle: FunctionComponent = ({\r\n title,\r\n className,\r\n iconClassName,\r\n}) => {\r\n return (\r\n
\r\n \r\n
{title}
\r\n
\r\n );\r\n};\r\n","import React, { ReactElement, FunctionComponent } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { Alert } from \"react-bootstrap\";\r\n\r\nimport \"./FeatureGroupBoxedIconTitle.scss\";\r\n\r\nexport interface FeatureGroupBoxedIconTitleProps {\r\n title: string | ReactElement;\r\n subtitle?: string | ReactElement;\r\n className?: string;\r\n alertBoxVariant: string;\r\n iconClassName: string;\r\n action?: ReactElement;\r\n}\r\n\r\nexport const FeatureGroupBoxedIconTitle: FunctionComponent = ({\r\n title,\r\n subtitle,\r\n className,\r\n alertBoxVariant,\r\n iconClassName,\r\n action,\r\n}) => {\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n {title}\r\n {!!subtitle && (\r\n {subtitle}\r\n )}\r\n \r\n
\r\n {!!action &&
{action}
}\r\n
\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { useField, FieldConfig } from \"formik\";\r\nimport FormGroup from \"react-bootstrap/FormGroup\";\r\nimport FormLabel from \"react-bootstrap/FormLabel\";\r\nimport FormControl from \"react-bootstrap/FormControl\";\r\nimport cn from \"classnames\";\r\n\r\ninterface FormikFieldGroupProps {\r\n type: string;\r\n className?: string;\r\n label?: string;\r\n placeholder?: string;\r\n maxLength?: number;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n checked?: boolean;\r\n fragile?: boolean; // when true, an invalid field will display error even when touched is false\r\n}\r\n\r\nconst FormikFieldGroup: React.FunctionComponent = ({\r\n type,\r\n className,\r\n label,\r\n fragile,\r\n ...props\r\n}) => {\r\n const [field, meta] = useField(props);\r\n\r\n const isInvalid: boolean = meta.error && (fragile || meta.touched);\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {isInvalid && (\r\n \r\n {meta.error || \"\"}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default FormikFieldGroup;\r\n","import { ApiService } from \".\";\r\nimport IOrgsApiService from \"./IOrgsApiService\";\r\nimport { PagedModel } from \"../models/PagedModel\";\r\nimport OrgKeyModel from \"../models/OrgKeyModel\";\r\nimport KeyRotationPassphraseModel from \"../models/KeyRotationPassphraseModel\";\r\nimport KeyRotationStatusModel from \"../models/KeyRotationStatusModel\";\r\nimport ScheduleModel from \"../models/ScheduleModel\";\r\nimport ReminderModel from \"../models/KeyRotationReminderModel\";\r\n\r\nexport default class OrgsApiService extends ApiService implements IOrgsApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public getPublicKeys(\r\n orgId: string,\r\n page: number = 1,\r\n perPage: number = 25,\r\n sortField: \"timestamp\",\r\n sortDirection: \"ascending\" | \"descending\" = \"descending\"\r\n ): Promise> {\r\n return this.get>(\r\n this.makeUrl(orgId, \"/keys\"),\r\n {\r\n page,\r\n perPage,\r\n sortField,\r\n sortDirection,\r\n },\r\n true\r\n );\r\n }\r\n\r\n public beginKeyRotationEstimate(orgId: string): Promise {\r\n return this.post(\r\n this.makeUrl(orgId, \"/keys/rotation/estimate\"),\r\n {}\r\n );\r\n }\r\n\r\n public removeKeyRotationEstimate(orgId: string): Promise {\r\n return this.delete(this.makeUrl(orgId, \"/keys/rotation/estimate\"));\r\n }\r\n\r\n public getKeyRotationPassphrase(orgId: string): Promise {\r\n return this.get(\r\n this.makeUrl(orgId, \"/keys/passphrase\"),\r\n {},\r\n true\r\n );\r\n }\r\n\r\n public validateKeyRotationPassphrase(orgId: string, passphrase: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/passphrase\"), { passphrase });\r\n }\r\n\r\n public getKeyRotationReminder(orgId: string): Promise {\r\n return this.get(this.makeUrl(orgId, \"/keys/reminder\"), {}, true);\r\n }\r\n\r\n public setKeyRotationReminder(orgId: string, reminderDate: Date): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/reminder\"), { reminderDate });\r\n }\r\n\r\n public beginKeyRotation(\r\n orgId: string,\r\n passphrase: string,\r\n schedule: ScheduleModel\r\n ): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation\"), {\r\n passphrase,\r\n schedule,\r\n });\r\n }\r\n\r\n public pauseKeyRotation(orgId: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/pause\"), {});\r\n }\r\n\r\n public resumeKeyRotation(orgId: string): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/resume\"), {});\r\n }\r\n\r\n public setKeyRotationSchedule(\r\n orgId: string,\r\n schedule: ScheduleModel\r\n ): Promise {\r\n return this.post(this.makeUrl(orgId, \"/keys/rotation/schedule\"), {\r\n schedule,\r\n });\r\n }\r\n\r\n public getKeyRotationStatus(orgId: string): Promise {\r\n return this.get(this.makeUrl(orgId, \"/keys/rotation\"), {}, true);\r\n }\r\n\r\n public removeKeyRotationStatus(orgId: string): Promise {\r\n return this.delete(this.makeUrl(orgId, \"/keys/rotation\"));\r\n }\r\n\r\n private makeUrl(orgId: string, endpoint?: string) {\r\n return `organizations/${orgId}${endpoint}`;\r\n }\r\n}\r\n","import IHelpUrlBuilderService from \"./IHelpUrlBuilderService\";\r\nimport { TRANSFER_DOC_VERSION } from \"../constants\";\r\n\r\nexport default class HelpUrlBuilderService implements IHelpUrlBuilderService {\r\n // full structure: https://docs.ipswitch.com/MOVEit/Transfer/Help///.htm\r\n private readonly baseUrl = \"https://docs.ipswitch.com/MOVEit/\";\r\n // TODO: add user api service to dynamically fetch user type\r\n constructor(private readonly userType: string, private readonly languageCode: string) {}\r\n\r\n public getHelpUrl(targetId: string) {\r\n return `${this.baseUrl}Transfer${TRANSFER_DOC_VERSION}/Help/${this.userType}/${this.languageCode}/${targetId}.htm`;\r\n }\r\n}\r\n","import { PublicDownloadLinkModel } from \"../models/PublicDownloadLinkModel\";\r\nimport { PublicDownloadLinkRequestModel } from \"../models/PublicDownloadLinkRequestModel\";\r\nimport { ApiService } from \"./ApiService\";\r\nimport { IPublicDownloadLinkApiService } from \"./IPublicDownloadLinkApiService\";\r\n\r\nexport class PublicDownloadLinkApiService extends ApiService\r\n implements IPublicDownloadLinkApiService {\r\n constructor(baseUrl: string, language?: string) {\r\n super(baseUrl, language);\r\n }\r\n\r\n public generatePublicDownloadLink(\r\n fileId: number,\r\n publicLinkParams: PublicDownloadLinkRequestModel\r\n ): Promise {\r\n return this.post(`files/${fileId}/publiclinks`, publicLinkParams);\r\n }\r\n\r\n public getPublicLinkInfo(\r\n fileId: number,\r\n publicLinkId: string\r\n ): Promise {\r\n return this.get(`files/${fileId}/publiclinks/${publicLinkId}`);\r\n }\r\n\r\n public deletePublicLink(fileId: number, publicLinkId: string): Promise {\r\n return this.delete(`files/${fileId}/publiclinks/${publicLinkId}`);\r\n }\r\n}\r\n"],"sourceRoot":""}