package Ġstudio . for face . easy gradle . publish Ċ Ċ import Ġcom . v ann ik tech . maven . publish . Son atype Host Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . builtins . List Serializer Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . kotlin . dsl . provide Delegate Ċ import Ġstudio . for face . easy gradle . internal . Config ReadWrite Property Ċ import Ġstudio . for face . easy gradle . internal . Signing Type Ċ import Ġstudio . for face . easy gradle . internal . assert Strings NotEmpty Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* Ġ@ return Ġ[ Publish Config Builder ] Ċ Ġ* Ġ@ param Ġblock ĠLambda Ġfor Ġsetup Ġ[ Easy Publish Extension ] Ċ Ġ*/ Ċ fun ĠPublish Config ( block : ĠPublish Config Builder ) Ġ= Ġblock Ċ Ċ /** Ċ Ġ* ĠHold s Ġparams Ġfor Ġpublication . Ċ Ġ* ĠEach Ġparameter Ġcan Ġbe Ġset Ċ Ġ* Ġ* Ġprogram matically Ċ Ġ* Ġ* Ġin Ġ` gradle . properties ` Ċ Ġ* Ġ* Ġas ĠEnvironment Ġvariable Ċ Ġ* Ġproperties Ġnames Ġin Ġgradle . properties Ġreflect Ġthe Ġfield Ġname Ġof Ġthe Ġvariable Ġand Ġenvironment Ġvariables Ġreflect Ġthe Ċ Ġ* Ġproperty Ġname Ġname Ġas Ġuppercase Ġsnake _ case Ġwhere Ġnot Ġspecified Ġdifferently . Ċ Ġ* ĠSee Ġgradle . properties . template Ġfor Ġmore Ġexamples Ċ Ġ*/ Ċ @ Suppress (" Un necessary Abstract Class ", Ġ" Member Visibility Can Be Private ") Ċ abstract Ġclass ĠEasy Publish Extension Ġ@ Inject Ġconstructor ( project : ĠProject ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsername Ġof ĠMaven Ġrepository . ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` maven . user ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġusername Ġby Ġproject . required ("", ĠpropertyName Ġ= Ġ" maven . user ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPassword Ġof ĠMaven Ġuser . ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` maven . password ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpassword Ġby Ġproject . required ("", ĠpropertyName Ġ= Ġ" maven . password ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSon atype Ġhost ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ[ Son atype Host . DEFAULT ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġson atype Host : ĠSon atype Host Ġ= ĠSon atype Host . DEFAULT ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( son atype Host String . equals (" S 0 1 ", Ġignore Case Ġ= Ġtrue )) ĠSon atype Host . S 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfield ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRoot Ġurl Ġof ĠSon atype Ġhost ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` son atype Host ` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSetting Ġthis Ġvalue Ġwill Ġoverride Ġ[ son atype Host ] ĊĠĠĠĠ Ġ* ĠOnly Ġaccepted Ġvalue Ġis Ġ" S 0 1 " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġson atype Host String Ġby Ġproject ("", ĠpropertyName Ġ= Ġ" son atype Host ") ĊĊĠĠĠ Ġ/** ĠGroup Ġof Ġthe ĠLibrary Ġ*/ ĊĠĠĠ Ġvar Ġgroup Ġby Ġproject . required ( project . group . toString ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠName Ġof Ġthe Ġartifact Ġto Ġpublic . ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ[ Project . getName ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġartifact Ġby Ġproject . required ( project . name ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠName Ġof Ġthe Ġproject Ġon ĠMaven . ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ`$ group :$ artifact ` ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` projectName ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġname Ġby Ġproject ("$ group :$ artifact ", Ġ" projectName ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVersion Ġof Ġthe Ġlibrary ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` version ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġversion Name Ġby Ġproject . required ( project . version . toString (), Ġ" version ") ĊĊĠĠĠ Ġ/** ĠOptional Ġdescription Ġof Ġthe Ġlibrary Ġ*/ ĊĠĠĠ Ġvar Ġdescription Ġby Ġproject ("") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS cm Ġurl Ġof Ġthe Ġlibrary ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` scm . url ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsc m Url Ġby Ġproject . required ("", Ġ" scm . url ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS cm Ġconnection Ġof Ġthe Ġlibrary ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` scm . connection ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsc m Connection Ġby Ġproject ("", Ġ" scm . connection ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS cm ĠDev Ġconnection Ġof Ġthe Ġlibrary ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` scm . dev Connection ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsc m Dev Connection Ġby Ġproject ("", Ġ" scm . dev Connection ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġpublication Ġmust Ġbe Ġpublished ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ` false ` ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` maven . publish ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpublish Ġby Ġproject ( false , ĠpropertyName Ġ= Ġ" maven . publish ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġsigning Ġshould Ġbe Ġenabled ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ` true ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsigning Enabled Ġby Ġproject ( true , ĠpropertyName Ġ= Ġ" signing . enabled ") ĊĊĠĠĠ Ġinternal Ġval Ġsigning Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Enabled . not () Ġ-> ĠSign ing Type . None ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġsigning KeyId Ġ}. is Success Ġ-> ĠSign ing Type . Key Ring File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġsigning Ascii Key Ġ}. is Success Ġ-> ĠSign ing Type . Ascii Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Signing Ġis Ġenabled , Ġbut Ġno Ġkey Ġid Ġor Ġascii Ġkey Ġis Ġprovided " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKey Ġid Ġfor Ġsigning ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` signing . key Id ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsigning KeyId Ġby Ġproject . required ( propertyName Ġ= Ġ" signing . key Id ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAsc ii Ġformat ĠKey Ġfor Ġsigning ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` signing . ascii Key ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsigning Ascii Key Ġby Ġproject . required ( propertyName Ġ= Ġ" signing . ascii Key ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPassword Ġfor Ġsigning ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` signing . password ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsigning Password Ġby Ġproject . required ( propertyName Ġ= Ġ" signing . password ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKey Ring Ġfile Ġpath Ġfor Ġsigning ĊĠĠĠĠ Ġ* ĠProperty Ġname : Ġ` signing . key Ring FilePath ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsigning Key Ring FilePath Ġby Ġproject . required ( propertyName Ġ= Ġ" signing . key Ring FilePath ") ĊĊĠĠĠ Ġ// Ġregion Ġinternal ĊĠĠĠ Ġinternal Ġval Ġde vs : ĠMutable List < Developer > Ġby Ġproject ( mutable ListOf < Developer >(), ĠpropertyName Ġ= Ġ" developers ") ĊĠĠĠ Ġinternal Ġval Ġlic s : ĠMutable List < License > Ġby Ġproject ( mutable ListOf < License >(), ĠpropertyName Ġ= Ġ" licenses ") ĊĊĠĠĠ Ġ@ Suppress (" Unused Private Member ") ĊĠĠĠ Ġprivate Ġoperator Ġfun Ġ< T Ġ: ĠAny > ĠProject . invoke ( ĊĠĠĠĠĠĠĠ Ġdefault : ĠT , ĊĠĠĠĠĠĠĠ ĠpropertyName : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġenv Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ= Ġobject Ġ: ĠConfig ReadWrite Property < Easy Publish Extension , ĠT >( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ Ġdefault , ĊĠĠĠĠĠĠĠ ĠpropertyName Ġ= ĠpropertyName , ĊĠĠĠĠĠĠĠ Ġenv Name Ġ= Ġenv Name ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠString . toList ( property : ĠK Property < *> ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Publish Extension :: devs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson . decode FromString ( List Serializer ( Developer . serializer ()), Ġthis ) Ġas ? ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEasy Publish Extension :: lic s Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson . decode FromString ( List Serializer ( License . serializer ()), Ġthis ) Ġas ? ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠNo Class Def Found Error ) Ġ{ Ġ// ĠTODO ĠCould Ġnot Ġinitialize Ġclass Ġkotlinx . serialization . json . Json ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Cannot Ġparse Ġ${ property . name }: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠProject . required ( ĊĠĠĠĠĠĠĠ Ġdefault : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ ĠpropertyName : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġenv Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ= Ġobject Ġ: ĠConfig ReadWrite Property < Easy Publish Extension , ĠString >( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ Ġdefault , ĊĠĠĠĠĠĠĠ ĠpropertyName Ġ= ĠpropertyName , ĊĠĠĠĠĠĠĠ Ġenv Name Ġ= Ġenv Name ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠEasy Publish Extension , Ġproperty : ĠK Property < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġsuper . getValue ( this Ref , Ġproperty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ property . name } Ġis Ġrequired , Ġdeclare Ġas Ġ'${ property . actual PropertyName }' Ġin Ġyour ĠGradle Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" properties , Ġor Ġas Ġ'${ property . actual Env Name }' Ġin Ġyour Ġenvironment Ġvariables " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( license Ġin Ġlic s ) Ġlicense . validate () ĊĠĠĠĠĠĠĠ Ġfor Ġ( developer Ġin Ġde vs ) Ġdeveloper . validate () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠD sl Ġfunctions ĊĠĠĠ Ġ// Ġregion ĠLicense s ĊĠĠĠ Ġ/** Ġ@ return Ġ[ License ], Ġuse Ġ` unary Plus ` Ġfor Ġadd Ġit Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun Ġlicense ( block : ĠLicense . () Ġ-> ĠUnit ) Ġ= ĠLicense (). apply ( block ) ĊĊĠĠĠ Ġ/** ĠAdd Ġreceiver Ġ[ License ] Ġto Ġ[ Easy Publish Extension . licenses ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġoperator Ġfun ĠLicense . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġlic s . add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠScope Ġfor Ġ[ License s Builder . license ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġclass ĠLicense s Builder Ġinternal Ġconstructor () ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġset Ġof Ġ[ License ] s Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun Ġlicenses ( block : ĠLicense s Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLicense s Builder (). apply ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCreate Ġand Ġadd Ġa Ġ[ License ] Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") Ġ// ĠReceiver Ġas Ġscope ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun ĠLicense s Builder . license ( block : ĠLicense . () Ġ-> ĠUnit ) Ġ= Ġ+ License (). apply ( block ) ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠDevelopers ĊĠĠĠ Ġ/** Ġ@ return Ġ[ Developer ], Ġuse Ġ` unary Plus ` Ġfor Ġadd Ġit Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun Ġdeveloper ( block : ĠDeveloper . () Ġ-> ĠUnit ) Ġ= ĠDeveloper (). apply ( block ) ĊĊĠĠĠ Ġ/** ĠAdd Ġreceiver Ġ[ Developer ] Ġto Ġ[ Easy Publish Extension . devs ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġoperator Ġfun ĠDeveloper . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġde vs . add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠScope Ġfor Ġ[ De velopers Builder . developer ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġclass ĠDevelopers Builder Ġinternal Ġconstructor () ĊĊĠĠĠ Ġ/** ĠCreate Ġand Ġadd Ġa Ġ[ License ] Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun Ġdevelopers ( block : ĠDevelopers Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDevelopers Builder (). apply ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġset Ġof Ġ[ Developer ] s Ġto Ġthe Ġcurrent Ġ[ Easy Publish Extension ] Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") Ġ// ĠReceiver Ġas Ġscope ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġfun ĠDevelopers Builder . developer ( block : ĠDeveloper . () Ġ-> ĠUnit ) Ġ= Ġ+ Developer (). apply ( block ) ĊĠĠĠ Ġ// Ġend region ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠChildren ĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġclass ĠDeveloper Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠString Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġvar Ġemail : ĠString Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Strings NotEmpty (:: id , Ġ:: name , Ġ:: email ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" id : Ġ$ id , Ġname : Ġ$ name , Ġemail : Ġ$ email " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Marker ĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġclass ĠLicense Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġurl : ĠString Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Strings NotEmpty (:: name , Ġ:: url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ name : Ġ$ url " ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ@ Dsl Marker ĊĠĠĠ Ġannotation Ġclass ĠMarker Ċ } Ċ