package Ġorg . intellij . plugin . tracker . data . links Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util . Stack Ċ import Ġjava . util . regex . Pattern Ċ import Ġorg . intellij . plugin . tracker . data . changes . Change Ċ import Ġorg . intellij . plugin . tracker . data . changes . Custom Change Ċ import Ġorg . intellij . plugin . tracker . data . changes . Line Change Ċ import Ġorg . intellij . plugin . tracker . data . changes . Lines Change Ċ import Ġorg . intellij . plugin . tracker . core . change . Change Tracker Ċ import Ġorg . intellij . plugin . tracker . utils . Link Patterns Ċ Ċ /** Ċ Ġ* ĠData Ġclass Ġthat Ġcorresponds Ġto Ġa Ġrelative Ġlink Ġto Ġdirectory Ċ Ġ*/ Ċ data Ġclass ĠRelative Link To Directory ( ĊĠĠĠ Ġoverride Ġval Ġlink Info : ĠLink Info , ĊĠĠĠ Ġoverride Ġval Ġpattern : ĠPattern ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġvar Ġspecific Commit : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠRelative Link < Custom Change >( link Info , Ġpattern , Ġspecific Commit ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġline Referenced : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Starting Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Ending Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġfile Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced FileName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġval Ġpath : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrelative Path ĊĊĠĠĠ Ġoverride Ġfun Ġvisit ( visitor : ĠChange Tracker ): ĠChange Ġ= Ġvisitor . getLocal Directory Changes ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġnew Ġequivalent Ġlink Ġbased Ġon Ġthe Ġpassed Ġin Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate Link ( change : ĠCustom Change , Ġindex : ĠInt , Ġcommit SHA : ĠString ?): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġlink Info . get After Path To Original Format ( change . after Path String ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeep Ġcopy Ġthis Ġlink Ġand Ġreturn Ġthe Ġcopied Ġlink Ġwith Ġa Ġnew Ġafter Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcopy With After Path ( link : ĠLink , Ġafter Path : ĠString ): ĠRelative Link To Directory Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Info Copy : ĠLink Info Ġ= Ġlink . link Info . copy ( link Path Ġ= Ġafter Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( link Info Ġ= Ġlink Info Copy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmarkdown File Moved ( after Path : ĠString ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġthis Ġlink Ġto Ġa Ġlink Ġto Ġa Ġfile , Ġcontaining Ġthe Ġparameter ized Ġfile Ġpath Ġas Ġlink Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconvert ToFile Link ( filePath : ĠString ): ĠRelative Link ToFile Ġ= ĊĠĠĠĠĠĠĠ ĠRelative Link ToFile ( link Info Ġ= Ġlink Info . copy ( link Path Ġ= ĠfilePath ), Ġspecific Commit Ġ= Ġspecific Commit ) Ċ } Ċ Ċ /** Ċ Ġ* ĠData Ġclass Ġthat Ġcorresponds Ġto Ġa Ġrelative Ġlink Ġto Ġfile Ċ Ġ*/ Ċ data Ġclass ĠRelative Link ToFile ( ĊĠĠĠ Ġoverride Ġval Ġlink Info : ĠLink Info , ĊĠĠĠ Ġoverride Ġval Ġpattern : ĠPattern ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġvar Ġspecific Commit : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠRelative Link < Custom Change >( link Info , Ġpattern , Ġspecific Commit ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġline Referenced : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġreferenced Ġfile Ġname Ġonly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced FileName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġpath : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrelative Path ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Starting Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Ending Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthe Ġright Ġmethod Ġin Ġthe Ġimplementation Ġof ĠChange Tracker Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit ( visitor : ĠChange Tracker ): ĠChange Ġ= Ġvisitor . getLocal File Changes ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġnew Ġequivalent Ġlink Ġbased Ġon Ġthe Ġpassed Ġin Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate Link ( change : ĠCustom Change , Ġindex : ĠInt , Ġcommit SHA : ĠString ?): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġlink Info . get After Path To Original Format ( change . after Path String ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeep Ġcopy Ġthis Ġlink Ġand Ġreturn Ġthe Ġcopied Ġlink Ġwith Ġa Ġnew Ġafter Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcopy With After Path ( link : ĠLink , Ġafter Path : ĠString ): ĠRelative Link ToFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Info Copy : ĠLink Info Ġ= Ġlink . link Info . copy ( link Path Ġ= Ġafter Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( link Info Ġ= Ġlink Info Copy ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠData Ġclass Ġthat Ġcorresponds Ġto Ġa Ġrelative Ġlink Ġto Ġline Ċ Ġ*/ Ċ data Ġclass ĠRelative Link To Line ( ĊĠĠĠ Ġoverride Ġval Ġlink Info : ĠLink Info , ĊĠĠĠ Ġoverride Ġval Ġpattern : ĠPattern Ġ= ĠLink Patterns . Relative Link To Line . pattern , ĊĠĠĠ Ġoverride Ġvar Ġspecific Commit : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠRelative Link < Line Change >( link Info , Ġpattern , Ġspecific Commit ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġreferenced Ġline Ġpart Ġfrom Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġline Referenced : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmatcher . group ( 1 ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġreferenced Ġfile Ġname Ġpart Ġfrom Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced FileName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . name . replace ("# L ${ matcher . group ( 1 )} ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġmultiple Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Starting Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġmultiple Ġlines Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Ending Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġpath Ġwithout Ġthe Ġline Ġreferencing Ġpart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġpath : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelative Path . replace ("# L $ line Referenced ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelative Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthe Ġright Ġmethod Ġin Ġthe Ġimplementation Ġof ĠChange Tracker Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit ( visitor : ĠChange Tracker ): ĠChange Ġ= Ġvisitor . getLocal Line Changes ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeep Ġcopy Ġthis Ġlink Ġand Ġreturn Ġthe Ġcopied Ġlink Ġwith Ġa Ġnew Ġafter Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcopy With After Path ( link : ĠLink , Ġafter Path : ĠString ): ĠRelative Link To Line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Info Copy : ĠLink Info Ġ= Ġlink . link Info . copy ( link Path Ġ= Ġafter Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( link Info Ġ= Ġlink Info Copy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġnew Ġequivalent Ġlink Ġbased Ġon Ġthe Ġpassed Ġin Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate Link ( change : ĠLine Change , Ġindex : ĠInt , Ġcommit SHA : ĠString ?): ĠString ? Ġ= Ġchange . after Path [ index ] Ċ } Ċ Ċ /** Ċ Ġ* ĠData Ġclass Ġthat Ġcorresponds Ġto Ġa Ġrelative Ġlink Ġto Ġmultiple Ġlines Ċ Ġ*/ Ċ data Ġclass ĠRelative Link To Lines ( ĊĠĠĠ Ġoverride Ġval Ġlink Info : ĠLink Info , ĊĠĠĠ Ġoverride Ġval Ġpattern : ĠPattern Ġ= ĠLink Patterns . Relative Link To Lines . pattern , ĊĠĠĠ Ġoverride Ġvar Ġspecific Commit : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠRelative Link < Lines Change >( link Info , Ġpattern , Ġspecific Commit ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNo Ġsingle Ġline Ġreferenced ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġline Referenced : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġreferenced Ġfile Ġname Ġpart Ġfrom Ġthe Ġpath , Ġwithout Ġthe Ġline Ġrange Ġspecifications ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced FileName : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . name . replace ("# L ${ matcher . group ( 1 )} - L ${ matcher . group ( 2 )} ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġfirst Ġline Ġreferenced Ġ( inclusive ) Ġpart Ġfrom Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Starting Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmatcher . group ( 1 ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġlast Ġline Ġreferenced Ġpart Ġ( inclusive ) Ġfrom Ġthe Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferenced Ending Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmatcher . group ( 2 ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġfull Ġpath Ġwithout Ġthe Ġline - range Ġspecifications ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġpath : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelative Path . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# L $ referenced Starting Line - L $ referenced Ending Line ", Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelative Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthe Ġright Ġmethod Ġin Ġthe Ġimplementation Ġof ĠChange Tracker Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġvisit ( visitor : ĠChange Tracker ): ĠChange Ġ= Ġvisitor . getLocal Lines Changes ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeep Ġcopy Ġthis Ġlink Ġand Ġreturn Ġthe Ġcopied Ġlink Ġwith Ġa Ġnew Ġafter Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcopy With After Path ( link : ĠLink , Ġafter Path : ĠString ): ĠRelative Link To Lines Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Info Copy : ĠLink Info Ġ= Ġlink . link Info . copy ( link Path Ġ= Ġafter Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( link Info Ġ= Ġlink Info Copy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġnew Ġequivalent Ġlink Ġbased Ġon Ġthe Ġpassed Ġin Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate Link ( change : ĠLines Change , Ġindex : ĠInt , Ġcommit SHA : ĠString ?): ĠString ? Ġ= Ġchange . after Path [ index ] Ċ } Ċ Ċ /** Ċ Ġ* ĠFirst ly , Ġfinds Ġthe Ġabsolute Ġpath Ġof Ġthe Ġgiven Ġlink Ġusing Ġthe Ġlink Ġpath Ġand Ġthe Ġfile Ġpath Ċ Ġ* Ġthen Ġsimpl ifies Ġand Ġreturns Ġthis Ġabsolute Ġpath Ċ Ġ*/ Ċ fun Ġcheck Relative Link ( link Path : ĠString , ĠfilePath : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġlink Ġ= Ġlink Path ĊĠĠĠ Ġif Ġ( filePath . contains ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġlink Ġ= ĠfilePath . replace ( filePath . split ("/ "). last (), Ġ"") Ġ+ Ġlink Path ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsimplify Link ( link ) Ċ } Ċ Ċ /** Ċ Ġ* ĠConverts Ġthe Ġgiven Ġlink Ġpath Ġwhich Ġis Ġcontaining Ġsingle Ġor Ġdouble Ġdots Ċ Ġ* Ġto Ġa Ġsimple Ġ( without Ġdots ) Ġversion . Ċ Ġ*/ Ċ fun Ġsimplify Link ( link : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġst : ĠStack < String > Ġ= ĠStack < String >() ĊĠĠĠ Ġval Ġst 1 : ĠStack < String > Ġ= ĠStack < String >() ĊĠĠĠ Ġvar Ġresult Ġ= Ġ"" ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġlink . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdir Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ// Ġskip Ġall Ġthe Ġmultiple Ġ'/' Ġeg . Ġ" ///// "" ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġlink . length Ġ&& Ġlink [ i ] Ġ== Ġ'/') Ġi ++ ĊĊĠĠĠĠĠĠĠ Ġ// Ġstores Ġdirectory 's Ġname (" a ", Ġ" b " Ġetc .) Ġor Ġcommands (" ." /" .. ") Ġinto Ġdir ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġlink . length Ġ&& Ġlink [ i ] Ġ!= Ġ'/') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir Ġ+= Ġlink [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġdir Ġhas Ġ".. " Ġjust Ġpop Ġthe Ġtop most Ġelement Ġif ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġstack Ġis Ġnot Ġempty Ġotherwise Ġignore ĊĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== Ġ".. ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! st . empty ()) Ġst . pop () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dir Ġ== Ġ". ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġdir Ġhas Ġ"." Ġthen Ġsimply Ġcontinue Ġwith Ġthe Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dir . isNotEmpty ()) Ġst . push ( dir ) ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ(! st . empty ()) Ġ{ Ġst 1 . push ( st . pop ()) Ġ} ĊĠĠĠ Ġwhile Ġ(! st 1 . empty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġif Ġ( st 1 . size Ġ!= Ġ 1 ) Ġst 1 . pop (). toString () Ġ+ Ġ"/" Ġelse Ġst 1 . pop () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ