/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 5 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . wire . schema Ċ Ċ import Ġcom . squareup . wire . schema . Sem Ver . Companion . toLowerCase Sem Ver Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġof Ġrules Ġthat Ġdescribes Ġwhich Ġtypes Ġand Ġmembers Ġto Ġretain Ġand Ġwhich Ġto Ġremove . Ċ Ġ* Ċ Ġ* ĠMembers Ġmay Ġbe Ġpr uned Ġusing Ġeither Ġtheir Ġidentifier Ġ( package , Ġtype Ġname , Ġmember Ġname ) Ġor Ġtheir Ċ Ġ* Ġversion Ġ( since Ġand Ġuntil Ġoptions ). Ċ Ġ* Ċ Ġ* ĠDes p ite Ġthe Ġbuilder , Ġinstances Ġof Ġthis Ġclass Ġare Ġnot Ġsafe Ġfor Ġconcurrent Ġuse . Ċ Ġ* Ċ Ġ* Ġ### ĠIdentifier ĠMatch ing Ċ Ġ* Ċ Ġ* ĠIf Ġa Ġmember Ġis Ġa Ġroot Ġin Ġthe Ġset , Ġits Ġtype Ġis Ġimplicitly Ġalso Ġconsidered Ġa Ġroot . ĠA Ġtype Ġthat Ġis Ċ Ġ* Ġa Ġroot Ġwithout Ġa Ġspecific Ġmember Ġimplicitly Ġset Ġall Ġof Ġthat Ġtype 's Ġmembers Ġas Ġroots , Ġbut Ġnot Ġits Ċ Ġ* Ġnested Ġtypes . Ċ Ġ* Ċ Ġ* ĠIdent ifiers Ġin Ġthis Ġset Ġmay Ġbe Ġin Ġthe Ġfollowing Ġforms : Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠPackage Ġnames , Ġfollowed Ġby Ġ` .* `, Ġlike Ġ` squareup . protos . person .* `. ĠThis Ġmatches Ġtypes Ġand Ċ Ġ* ĠĠĠ Ġservices Ġdefined Ġin Ġthe Ġpackage Ġand Ġits Ġdesc endant Ġpackages . Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠFull y Ġqualified Ġtype Ġand Ġservice Ġnames , Ġlike Ġ` squareup . protos . person . Person `. Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠFull y Ġqualified Ġmember Ġnames , Ġwhich Ġare Ġtype Ġnames Ġfollowed Ġby Ġa Ġ'#', Ġfollowed Ġby Ġa Ġmember Ċ Ġ* ĠĠĠ Ġname , Ġlike Ġ` squareup . protos . person . Person # address `. ĠMembers Ġmay Ġbe Ġfields , Ġenum Ġconstants Ġor Ċ Ġ* ĠĠĠ ĠRPC s . Ċ Ġ* Ċ Ġ* ĠAn Ġidentifier Ġset Ġpopulated Ġwith Ġ` Movie ` Ġand Ġ` Actor # name ` Ġcontains Ġall Ġmembers Ġof Ġ` Movie ` Ġ( such Ċ Ġ* Ġas Ġ` Movie # name ` Ġand Ġ` Movie # release _ date `). ĠIt Ġcontains Ġthe Ġtype Ġ` Actor ` Ġand Ġone Ġmember Ċ Ġ* Ġ` Actor # name `, Ġbut Ġnot Ġ` Actor # birth _ date ` Ġor Ġ` Actor # os car _ count `. Ċ Ġ* Ċ Ġ* ĠThis Ġset Ġhas Ġ* root Ġidentifiers * Ġand Ġ* prune Ġidentifiers *, Ġwith Ġthe Ġmost Ġprecise Ġidentifier Ċ Ġ* Ġtaking Ġprecedence Ġover Ġthe Ġother Ġones . ĠFor Ġinstance , Ġif Ġthere Ġis Ġone Ġroot Ġidentifier Ċ Ġ* Ġ` a . Movie ` Ġalong Ġa Ġpr uning Ġidentifier Ġ` a .* `, Ġthe Ġtype Ġ` a . Movie ` Ġis Ġconsidered Ġa Ġroot . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġroots Ġset Ġis Ġempty , Ġthat Ġimplies Ġthat Ġall Ġelements Ġare Ġconsidered Ġroots . ĠUse Ġthis Ġto Ċ Ġ* Ġprune Ġun wanted Ġtypes Ġand Ġmembers Ġwithout Ġalso Ġmarking Ġeverything Ġelse Ġas Ġroots . Ċ Ġ* Ċ Ġ* Ġ### ĠVersion ĠMatch ing Ċ Ġ* Ċ Ġ* ĠMembers Ġmay Ġbe Ġdeclared Ġwith Ġ` wire . since ` Ġand Ġ` wire . until ` Ġoptions . ĠFor Ġexample , Ġthese Ġoptions Ċ Ġ* Ġdeclare Ġa Ġfield Ġ` age ` Ġthat Ġwas Ġreplaced Ġwith Ġ` birth _ date ` Ġin Ġversion Ġ" 5 . 0 ": Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* ĠĠ Ġoptional Ġint 3 2 Ġage Ġ= Ġ 3 Ġ[( wire . until ) Ġ= Ġ" 5 . 0 "]; Ċ Ġ* ĠĠ Ġoptional ĠDate Ġbirth _ date Ġ= Ġ 4 Ġ[( wire . since ) Ġ= Ġ" 5 . 0 "]; Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠClient Ġcode Ġshould Ġtypically Ġtarget Ġa Ġsingle Ġversion . ĠIn Ġthis Ġexample , Ġversions Ġ<= Ġ" 4 . 0 " Ġwill Ċ Ġ* Ġhave Ġthe Ġ` age ` Ġfield Ġonly Ġand Ġversions Ġ>= Ġ" 5 . 0 " Ġwill Ġhave Ġthe Ġ` birth _ date ` Ġfield Ġonly . Ċ Ġ* Ċ Ġ* ĠService Ġcode Ġthat Ġsupports Ġmany Ġclients Ġshould Ġsupport Ġthe Ġunion Ġof Ġversions Ġof Ġall Ġsupported Ċ Ġ* Ġclients . ĠSuch Ġcode Ġwill Ġhave Ġboth Ġthe Ġ` age ` Ġand Ġ` birth _ date ` Ġfields . Ċ Ġ*/ Ċ class ĠP run ing Rules Ġprivate Ġconstructor ( builder : ĠBuilder ) Ġ{ ĊĠ Ġprivate Ġval Ġroots Ġ= Ġbuilder . roots . toSet () ĊĠ Ġprivate Ġval Ġpr unes Ġ= Ġbuilder . pr unes . toSet () ĊĠ Ġprivate Ġval Ġoldest Ġ= Ġbuilder . ol dest ĊĠ Ġprivate Ġval Ġnewest Ġ= Ġbuilder . new est ĊĠ Ġprivate Ġval Ġused Roots Ġ= Ġmutable Set Of < String >() ĊĠ Ġprivate Ġval Ġused P run es Ġ= Ġmutable Set Of < String >() ĊĊĠ Ġval ĠisEmpty : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġroots . isEmpty () Ġ&& Ġpr unes . isEmpty () Ġ&& Ġoldest Ġ== Ġnull Ġ&& Ġnewest Ġ== Ġnull ĊĊĠ Ġ/** ĠReturns Ġtrue Ġunless Ġ[ options ] Ġspecifies Ġa Ġversion Ġthat Ġis Ġoutside Ġof Ġthe Ġconfigured Ġrange . Ġ*/ ĊĠ Ġfun Ġis Field Ret ained Version ( options : ĠOptions ) Ġ= ĊĠĠĠĠĠ Ġis Ret ained Version ( options , ĠFIELD _ SIN CE , ĠFIELD _ UNT IL ) ĊĊĠ Ġ/** ĠReturns Ġtrue Ġunless Ġ[ options ] Ġspecifies Ġa Ġversion Ġthat Ġis Ġoutside Ġof Ġthe Ġconfigured Ġrange . Ġ*/ ĊĠ Ġfun Ġis Enum Constant Ret ained Version ( options : ĠOptions ) Ġ= ĊĠĠĠĠĠ Ġis Ret ained Version ( options , ĠEN UM _ CONSTANT _ SIN CE , ĠEN UM _ CONSTANT _ UNT IL ) ĊĊĠ Ġprivate Ġfun Ġis Ret ained Version ( ĊĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠ Ġsince Member : ĠProto Member , ĊĠĠĠ Ġuntil Member : ĠProto Member ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( new est Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġsince Option Ġ= Ġoptions [ since Member ] ĊĠĠĠĠĠ Ġval Ġsince Ġ= Ġ( since Option Ġas ? ĠString )?. toLowerCase Sem Ver () ĊĠĠĠĠĠ Ġif Ġ( since Ġ!= Ġnull Ġ&& Ġsince Ġ> Ġnewest ) Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( ol dest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġuntil Option Ġ= Ġoptions [ until Member ] ĊĠĠĠĠĠ Ġval Ġuntil Ġ= Ġ( until Option Ġas ? ĠString )?. toLowerCase Sem Ver () ĊĠĠĠĠĠ Ġif Ġ( until Ġ!= Ġnull Ġ&& Ġuntil Ġ<= Ġoldest ) Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġtrue Ġif Ġ` type ` Ġis Ġa Ġroot . Ġ*/ ĊĠ Ġfun Ġis Root ( type : ĠProto Type ) Ġ= Ġis Root ( type . toString ()) ĊĊĠ Ġ/** ĠReturns Ġtrue Ġif Ġ` proto Member ` Ġis Ġa Ġroot . Ġ*/ ĊĠ Ġfun Ġis Root ( proto Member : ĠProto Member ) Ġ= Ġis Root ( proto Member . toString ()) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġtrue Ġif Ġ` identifier ` Ġor Ġany Ġof Ġits Ġen closing Ġidentifiers Ġis Ġa Ġroot . ĠIf Ġany Ġen closing ĊĠĠ Ġ* Ġidentifier Ġis Ġpr uned , Ġthat Ġtakes Ġprecedence Ġand Ġthis Ġreturns Ġfalse Ġunless Ġthe Ġroot Ġidentifier ĊĠĠ Ġ* Ġis Ġmore Ġprecise . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġis Root ( identifier : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( roots . isEmpty ()) Ġreturn Ġ! pr unes ( identifier ) ĊĊĠĠĠ Ġvar Ġroot Match : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġprune Match : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġrule : ĠString ? Ġ= Ġidentifier ĊĠĠĠ Ġwhile Ġ( rule Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( prune Match Ġ== Ġnull Ġ&& Ġpr unes . contains ( rule )) Ġ{ ĊĠĠĠĠĠĠĠ Ġprune Match Ġ= Ġrule ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( root Match Ġ== Ġnull Ġ&& Ġroots . contains ( rule )) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Match Ġ= Ġrule ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrule Ġ= Ġen closing ( rule ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Root Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġprune Match Ġ!= Ġnull Ġ&& Ġroot Match Ġ!= Ġnull Ġ-> Ġprune Match . length Ġ< Ġroot Match . length ĊĠĠĠĠĠ Ġprune Match Ġ!= Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠ Ġroot Match Ġ!= Ġnull Ġ-> Ġtrue ĊĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( is Root ) Ġ{ ĊĠĠĠĠĠ Ġused Roots . add ( root Match !! ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( prune Match Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġused P run es . add ( prune Match ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġis Root ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġtrue Ġif Ġ` type ` Ġshould Ġbe Ġpr uned , Ġeven Ġif Ġit Ġis Ġa Ġtrans itive Ġdependency Ġof Ġa Ġroot . ĠIn ĊĠĠ Ġ* Ġthat Ġcase , Ġthe Ġreferring Ġmember Ġis Ġalso Ġpr uned . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġpr unes ( type : ĠProto Type ) Ġ= Ġpr unes ( type . toString ()) ĊĊĠ Ġ/** ĠReturns Ġtrue Ġif Ġ` proto Member ` Ġshould Ġbe Ġpr uned . Ġ*/ ĊĠ Ġfun Ġpr unes ( proto Member : ĠProto Member ) Ġ= Ġpr unes ( proto Member . toString ()) ĊĊĠ Ġ/** ĠReturns Ġtrue Ġif Ġ` identifier ` Ġor Ġany Ġof Ġits Ġen closing Ġidentifiers Ġis Ġpr uned . Ġ Ġ*/ ĊĠ Ġprivate Ġfun Ġpr unes ( identifier : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġroot Match : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġprune Match : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġrule : ĠString ? Ġ= Ġidentifier ĊĠĠĠ Ġwhile Ġ( rule Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( prune Match Ġ== Ġnull Ġ&& Ġpr unes . contains ( rule )) Ġ{ ĊĠĠĠĠĠĠĠ Ġprune Match Ġ= Ġrule ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( root Match Ġ== Ġnull Ġ&& Ġroots . contains ( rule )) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Match Ġ= Ġrule ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrule Ġ= Ġen closing ( rule ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpr uned Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġprune Match Ġ!= Ġnull Ġ&& Ġroot Match Ġ!= Ġnull Ġ-> Ġprune Match . length Ġ>= Ġroot Match . length ĊĠĠĠĠĠ Ġprune Match Ġ!= Ġnull Ġ-> Ġtrue ĊĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( pr uned ) Ġ{ ĊĠĠĠĠĠ Ġused P run es . add ( prune Match !! ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpr uned ĊĠ Ġ} ĊĊĠ Ġfun Ġunused Roots () Ġ= Ġroots Ġ- Ġused Roots ĊĊĠ Ġfun Ġunused P run es () Ġ= Ġpr unes Ġ- Ġused P run es ĊĊĠ Ġclass ĠBuilder Ġ{ ĊĠĠĠ Ġinternal Ġval Ġroots Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġinternal Ġval Ġpr unes Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġinternal Ġvar Ġoldest : ĠSem Ver ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġnewest : ĠSem Ver ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġadd Root ( identifier : ĠString ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġroots . add ( identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Root ( identifiers : ĠIterable < String >) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġroots . addAll ( identifiers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprune ( identifier : ĠString ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġpr unes . add ( identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprune ( identifiers : ĠIterable < String >) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġpr unes . addAll ( identifiers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġexclusive Ġlower Ġbound Ġof Ġthe Ġversion Ġrange . ĠFields Ġwith Ġ` until ` Ġvalues Ġgreater Ġthan Ġthis ĊĠĠĠĠ Ġ* Ġare Ġretained . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoldest ( ol dest : ĠString ?) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġthis . ol dest Ġ= Ġoldest ?. toLowerCase Sem Ver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġinclusive Ġupper Ġbound Ġof Ġthe Ġversion Ġrange . ĠFields Ġwith Ġ` since ` Ġvalues Ġless Ġthan Ġor Ġequal ĊĠĠĠĠ Ġ* Ġto Ġthis Ġare Ġretained . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnewest ( new est : ĠString ?) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠ Ġthis . new est Ġ= Ġnewest ?. toLowerCase Sem Ver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠP run ing Rules Ġ{ ĊĠĠĠĠĠ Ġcheck ( ol dest Ġ== Ġnull Ġ|| Ġnewest Ġ== Ġnull Ġ|| Ġoldest !! Ġ<= Ġnewest !! ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" expected Ġoldest Ġ$ ol dest Ġ<= Ġnewest Ġ$ new est " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġconflicting Rules Ġ= Ġroots . intersect ( pr unes ) ĊĠĠĠĠĠ Ġcheck ( conflict ing Rules . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" same Ġrule ( s ) Ġdefined Ġin Ġboth Ġroots Ġand Ġpr unes : Ġ${ conflict ing Rules . join ToString () }" ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠP run ing Rules ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġinternal Ġval ĠFIELD _ SIN CE Ġ= ĠProto Member . get ( Options . FIELD _ OPTIONS , Ġ" wire . since ") ĊĠĠĠ Ġinternal Ġval ĠFIELD _ UNT IL Ġ= ĠProto Member . get ( Options . FIELD _ OPTIONS , Ġ" wire . until ") ĊĠĠĠ Ġinternal Ġval ĠEN UM _ CONSTANT _ SIN CE Ġ= ĠProto Member . get ( Options . ENUM _ VALUE _ OPTIONS , Ġ" wire . since ") ĊĠĠĠ Ġinternal Ġval ĠEN UM _ CONSTANT _ UNT IL Ġ= ĠProto Member . get ( Options . ENUM _ VALUE _ OPTIONS , Ġ" wire . until ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġidentifier Ġor Ġwildcard Ġthat Ġen clo ses Ġ` identifier `, Ġor Ġnull Ġif Ġit Ġis Ġnot Ġen closed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* ĠIf Ġ` identifier ` Ġis Ġa Ġmember Ġthis Ġreturns Ġthe Ġen closing Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* ĠIf Ġit Ġis Ġa Ġtype Ġit Ġreturns Ġthe Ġen closing Ġpackage Ġwith Ġa Ġwildcard , Ġlike ĊĠĠĠĠ Ġ* ĠĠĠ Ġ` squareup . din osa urs .* `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* ĠIf Ġit Ġis Ġa Ġpackage Ġwith Ġa Ġwildcard , Ġit Ġreturns Ġthe Ġparent Ġpackage Ġwith Ġa Ġwildcard , Ġlike ĊĠĠĠĠ Ġ* ĠĠĠ Ġ` squareup .* `. ĠThe Ġroot Ġwildcard Ġis Ġa Ġl one Ġaster isk , Ġ` * `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġen closing ( identifier : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠ Ġval Ġhash Ġ= Ġidentifier . lastIndexOf ('# ') ĊĠĠĠĠĠ Ġif Ġ( hash Ġ!= Ġ- 1 ) Ġreturn Ġidentifier . substring ( 0 , Ġhash ) ĊĊĠĠĠĠĠ Ġval Ġfrom Ġ= Ġif Ġ( identifier . endsWith (" .* ")) Ġidentifier . length Ġ- Ġ 3 Ġelse Ġidentifier . length Ġ- Ġ 1 ĊĠĠĠĠĠ Ġval Ġdot Ġ= Ġidentifier . lastIndexOf ('.', Ġfrom ) ĊĠĠĠĠĠ Ġif Ġ( dot Ġ!= Ġ- 1 ) Ġreturn Ġidentifier . substring ( 0 , Ġdot ) Ġ+ Ġ" .* " ĊĊĠĠĠĠĠ Ġif Ġ( identifier Ġ!= Ġ"* ") Ġreturn Ġ"*" ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ