├── .gitignore ├── Assets ├── Materials.meta ├── Materials │ ├── White.mat │ └── White.mat.meta ├── Meshes.meta ├── Meshes │ ├── bunny.asset │ └── bunny.asset.meta ├── Scenes.meta ├── Scenes │ ├── Sample.unity │ └── Sample.unity.meta ├── Scripts.meta ├── Scripts │ ├── Editor.meta │ ├── Editor │ │ ├── ObjectFileFormatEditor.cs │ │ └── ObjectFileFormatEditor.cs.meta │ ├── ObjectFileFormat.cs │ └── ObjectFileFormat.cs.meta ├── Shaders.meta ├── Shaders │ ├── Transparent_Color_Diffuse.shader │ └── Transparent_Color_Diffuse.shader.meta ├── Textures.meta └── Textures │ ├── ScreenShot.png │ └── ScreenShot.png.meta ├── ProjectSettings ├── AudioManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshLayers.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── QualitySettings.asset ├── TagManager.asset └── TimeManager.asset ├── license.txt └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | [Ll]ibrary/ 2 | [Tt]emp/ 3 | [Oo]bj/ 4 | 5 | # Autogenerated VS/MD solution and project files 6 | *.csproj 7 | *.unityproj 8 | *.sln 9 | *.pidb 10 | *.userprefs 11 | 12 | .DS_Store 13 | -------------------------------------------------------------------------------- /Assets/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6acbeaeb9eb32490e8e61902cc123a40 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Materials/White.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 3 6 | m_ObjectHideFlags: 0 7 | m_PrefabParentObject: {fileID: 0} 8 | m_PrefabInternal: {fileID: 0} 9 | m_Name: White 10 | m_Shader: {fileID: 4800000, guid: c7d3d0987c8fe40b0a2ced8e196f2da6, type: 3} 11 | m_ShaderKeywords: [] 12 | m_CustomRenderQueue: -1 13 | m_SavedProperties: 14 | serializedVersion: 2 15 | m_TexEnvs: 16 | data: 17 | first: 18 | name: _MainTex 19 | second: 20 | m_Texture: {fileID: 0} 21 | m_Scale: {x: 1, y: 1} 22 | m_Offset: {x: 0, y: 0} 23 | data: 24 | first: 25 | name: _DecalTex 26 | second: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | data: 31 | first: 32 | name: _Detail 33 | second: 34 | m_Texture: {fileID: 0} 35 | m_Scale: {x: 1, y: 1} 36 | m_Offset: {x: 0, y: 0} 37 | m_Floats: 38 | data: 39 | first: 40 | name: _Shininess 41 | second: .699999988 42 | m_Colors: 43 | data: 44 | first: 45 | name: _Color 46 | second: {r: 1, g: 1, b: 1, a: 1} 47 | data: 48 | first: 49 | name: _Emission 50 | second: {r: 0, g: 0, b: 0, a: 0} 51 | data: 52 | first: 53 | name: _SpecColor 54 | second: {r: 1, g: 1, b: 1, a: 1} 55 | -------------------------------------------------------------------------------- /Assets/Materials/White.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 17f227f8ff0a2405482f0606dcc3fc9a 3 | NativeFormatImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Meshes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 09b560f684af54e63a077976a40a1b40 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Meshes/bunny.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!43 &4300000 4 | Mesh: 5 | m_ObjectHideFlags: 0 6 | m_PrefabParentObject: {fileID: 0} 7 | m_PrefabInternal: {fileID: 0} 8 | m_Name: bunny 9 | serializedVersion: 8 10 | m_SubMeshes: 11 | - serializedVersion: 2 12 | firstByte: 0 13 | indexCount: 3834 14 | topology: 0 15 | firstVertex: 0 16 | vertexCount: 641 17 | localAABB: 18 | m_Center: {x: .154999971, y: .14380002, z: .216299981} 19 | m_Extent: {x: 1.22399998, y: .923200011, z: 1.20869994} 20 | m_Shapes: 21 | vertices: [] 22 | shapes: [] 23 | channels: [] 24 | fullWeights: [] 25 | m_BindPose: [] 26 | m_BoneNameHashes: 27 | m_RootBoneNameHash: 0 28 | m_MeshCompression: 0 29 | m_StreamCompression: 0 30 | m_IsReadable: 1 31 | m_KeepVertices: 0 32 | m_KeepIndices: 0 33 | m_IndexBuffer: 00026b026c02540150011700670280026902440043006302010209020d020d0209020f02280126002c011c000e015501d501e700d8014d0173014501be00c700080028011701e000b1013601d300ac00af00a6009d018101140129022502df012d0159002f01700264026502290127011a0108021b02f2012502db01df0165026402840131010b0160006102800267023900a200ed00cd01b401ad01a10141014601ca01b401cd013e01640141003200cc012501c30013001f0078007d0072001901580105012a023102340242000400cd00bd0185012102ee01db00d8002e0078014d01980095009c00000251015601b100b500bf00c200bf00b500640270028e014200030058001b012301ee00f2011b02e101d3013401ce01ff0009011a01fb001e028300c001ac01e9004c007900a100ef00f000c001a4015b01d000ad00f300540231003b003800590252025702610258025c024c0284004b02af016a013c0111002400230014010e011c00270032013f0010020c0207021402100207022802be012302fb0125008500a7009e00aa008d00810086007b0147008b00f00188000700c9017d01bf01ce01cf01da010e0213021f02520044003e009a010401f800c200c500bf0066016b00d400400144015c01f801f101e6011f014a001400770069006a00a700b100ac0081008d0011009d0096009700140006011300e300e2000901e901f601e80153012a00ed01a5019e01920122012501cc0114029f0161011201510068006d00620067001f0043015c013b0138013f010c00250122015e003a014b001200f3007f002a01b0003900bf017d01b201c801e301b201d9013200b8014902430245029a00cc00b700060114004a007802f901370177025f01b7018c0129011a0104009200010129018c01d00048002901d00019000a000e00800259026202a2010801810148014a0158011901480158018d010f020902c5009000a500e5000301fa00a4000100dc00e601c201ae0166026d025e026301eb017302300238023702ff0107020c02660016014e01400244023f024e0245023f02c201e6016c014e0251024502ad01910194015600c000c4005a00f5006701050105000d01a501c70120025c001d00330164013e01490196016b0200026d006100620056013a0165018a000f003f01a5009000cf00a701b401ca011d004500a8008500250011023601b101a8010a018b00470094017001a601700065015e0079004c00a8004f004b00430065005f00690013020b020d022002bd011f02b600d500fa00b9011e02d70152015a016601130058014b01a200390030004000ec00fc00d2019101b5019e0097002000d201c101c401a4017d02750204021202fb0028012f016400050006014a00f2005101000210000f008a009b00a000bc0058014a014b019400720018013c0046003b0031003c003b00f900fb008300d901cc013200240130013f00af018001eb012e02350231022c0232022e02cb01dc00b9015f0251024e02e901ea01f301e901f301fd01770263017302c001c601ac01e0009301a60179010201e60051005e01680048005b01160002001501260110014a014801e200e3007902570252024b02590122002800c800c400bd0067015c014301fa015301d70070028b018e0182018d0186014600c000560003000100a40058000300a400240227022b0224022b022a021e000f01210000019901a30170019101d2013f010f004501440252024e02500055004e002f003d005c00e3000901ff00e100db00ee012e005a0278012c00fc00ec00620144014001820084008e00a101a20198019100f400a3006f01f600b900130006010501060105000501ef01e801f6013f00300118016001090055008e0084004c02d600da00de001b002800220084010702ff014d017801730126014a001f018a017a017e01b0002a010101b800aa00b00016021c0215020a02fe0105027f00ad00ae0087007f00ae00f20161019f0149024a02420272026d0266024b014a01b2009300d900e80039024702460242014d02550294000c000301a1007900c9006f00cd00fe008e018b019801ea00eb00f100dc0127022402af013c011301e7011e011102590280025f02da00d600e4017b01b2001001cc009a00c70092019e011d02980024001100f200890163026b01d101a9016f020a00880055024d0246023d007a007b00e201190217029301e000170173027c0299002b00e301bb010d00f70075020301e5009f001c0216022102b801a901d90171026e023b022a0123011b01bb00bf00c500c00046003c00bb01e301c801d901d401d001bd00c400c000aa00b800b5004801190107011b020802ed01780077006a0014018101080157012900380021005d003401630289015a0224010f011e0074014201470103020202f801b301c501bf01540059003500000110019901210060005d00940080007200200015008c005d000b0135002e01360020011b0010003d0104020a0215024e0174006e0073007c00cb00f40091009200f801f701ff019d019b0181014200920004003a01560151017a002f0074007d00780074000901e2000401e200f80004019000c500c2007201f1017601b700cc00890089008500b7007e003501fa015d0060000b019b00bc009f004000fc002701d401d101fc011e01b7008500860082008f0083017601f1013e002800340034005d014901be00b400cc009b009f00e500ac00b100bb00bb00af00ac0045010f004d01870188016801f000fe00fd00660061006d006d0016016600ae01c2013302e501e100ec01ae00ad00cb00ba00ae00cb001d029e018f018d018f019e01270225022e024c00ab0018001900290057011900230029002c012600630063002e012c01dd011902e2017f027c0273027b015a0067012f022c0229026d0238013b017001d201da01d6017001da01df00c101c9012d0030003900bc01cb01d300370094019501fd0101020b020d020b020102de00e900ee00e900ac01ee008e019b019d017c01ff01f701050206020e02530211018b000a01f60053024b0284008200820057024b0267006200c400ce00a500c9006700c400c800f000c601c001ec01e100ea00340028001b00600021000f01d6012101e000e000a601d601c100cf00a3002b0231022a025c0256028002d90093008c00fe010a020402e100e501db00a000c3008700d800d200de01ef00f100f900f000ef00f90035000b01330103010c0022012201fa000301ab0111021e01d200d800db0041004e003e01ae016d017401650284017c01740177017c014800d0005b01db01250227022702dc01db01d901a901d10153008700c300ba01ee01ef014f025e025d025d0255024f02180222021d0268017e018c010c017f01710115002000970097008e00150053026b005a0166015a016b00e701fb017402e7017a027b0274027a02e7014c024b02400214029001a001a0019f011402ef01d800de018001130108006201400160028300b901dc004c015b004d0039023302c201dc012402e001df01db01ea01ea01dc01e001700271026c02e300ff007602e5013002d100b6000200d5005e024f0250025002580261024f0147016e0111016802f5001800000064002d0228022a02bc0195019301a60193019501b001cb01bc015402f3006c005b025a01520155010e01d7007d01c901a7014b02520244024b02440240026f02f00169020a0019001700340231023502360243023c020c0210021a024a02580250025b01a40197016902f00107003002e4013d02e401d6003d0277014f016e02350137012a00af01130180016901420174016d01690174013a00800149004900aa013a0040023702380261026702390166026102390147024102500250024f02470298009c00a60071000d01120123002400310094019101700180009400ba0002003c0115017a003d002f00a80075007900a101960141013401d30121005f017702b6001800ab0063001f01b3002601550050005600d601a60170011d012b009201bb0192012b00b501a701c901d400a201a10120002d009e00df00d801e700c401c101df00710168018c0148028c001500a100c900a5001001b2004a01a301790100018900cc00b400b4007a027402ed00ee00230157005f00650065005e005700a700ac009d00200136005800b501ad01b401b401a701b501820175017601760183018201de00da00e900e6000a0147009d01a0019001bb00b100bf0072028a003f0130002d009300a901b801c50159013e00440077017401470147014f017701aa0149009a0068005e0197010f0124013f002f0128012101f7000d00b701f9017802f700ca00080013017302eb017f0230012401250125010c003001c501d801bf010801a201d4006b00f6006f016e0155025d024e005500090052005f0057004f004300440026011501120165013a015e008a017e027d0276027e028a01400016000d005b026c006002600268025b0252004d005b009b018e0198016101f201e1011a001801720072007d001a0083001e02b90154026c005b02520154025b02c600b80001011c012001580022023300e201e2011d01220254015d0134000b0033011d002b010b001d00cd01b601a801620112005300440162015300e00124022302c301e00123025d015401570164015d015701cb01b001a400dc00cb01a4001f02bd0121024f0255024602460247024f028801870179027e027602ff002c007e02ff00e1011b02dd0110001b00220022004d010f001a0109010c01de01d2002602f401860101020902010286018f0095008d008d0086008f000502fe01f601b8013200d50120011c012c012c012e012001320131016000ad01b5019101ed00a200e800b300e500fa00fa00d500b300a500ce00c5003e0059012800570282008600810062025902af00bd00a900a900a600af003701f901d0019f01a0011c00650271027002eb016301af0163025a022e0087019a01e4005b006e006a00f100ef00ea0050003b004600460056005000a0009b001400f301ea01f401ab004c00a100a100c100ab00a701ca01c801c701bb01c80165007300760092004200f40018011a00270027003f00180149000800c7002c022e02250229022c02250217011c019c01930117019c015302f6006b00da01d201c4017f010c010401df00c901bf01bf01d801df00de00e800d900d900d600de004001f50068026802600240016701f50040015c0167014001ab00c1006300800261025c0259005400640064002f015900ab011e0185002d01cf01ce01fe00cd0004000400fd00fe0036023f024302450243023f02e3012b001702b201e301170217000700880088000a0017004d0269013e028501bd01ca01cd018501ca016a020e000a006f026a020a00fe00f000f9006f00fe00f900cd006f00010001000300cd000d0016005e011600400048001d01e201170217022b001d0177007c007300690077007300e400f800e200ad007f00f300ef01ee01d800a80045007b002e01a300f400f40036002e01d901d101d4015a0289013b023b026e025a02ee01ba01eb00fe010402ba011e02fb001202d7011e02120255010802f2011c005501f2012f0232022c027e017a01d000d0008c017e010b0213020e020e0206020b02ba009f00bc00ae00ba00bc003d007b004500cc01dd002201b901d300cb01ff017c0184016700c800ce0075006700c900ce00c90067003a015101f2004b003a01f2005f01dd00d001d001f9015f01070119017100a3019901070134023a022d02d1002602d200c3001f0053006001550066006c01e601f101f10172016c0105020e0216020a020502160215020a0216029100a300cf005501d7005301ea01db01dc01560251025f025f028002560269016d013e025a007b018b008b0011015a00b101d70115021c02a801b101b10115021c023a007b027f02880176028a0178015a026e028c0048023d022e004d012200220059012e002002c701bd01b301170219026b01b30119026b011902dd0106006501700054025201060070005402060076007300cb00cb00ad0076004d02420169010e0011002300230019000e007201c301be011e00d501320064000000260028016400260096009d009c0095008f0096009c009500960038003b0050004e0041005000500041003800d100300237022f02d10037021a007d002f0074002f007d0062026a02800218021d028f010e006a0262025c0258024a024502510249024902510256022101d6012d01cf012d01d6016d00670075007d027e022c0075027d022c00ec0075022c00e500b3001f01130005015801e801de01df013b0145017301e900da00f501f501c001e900490080010800ca0013013c019900ca00b600bd00af00bb00c800bd00bb008f018301020212006201f30032023c0235022e0232023502870053001200090060014e01b800c600c200b0000101b800f900f100fb001e01e701aa0116017b007a004e0116017a00710265026e029e01a5010f028d019e010f02820183018f018f018d018201d5011e002100e700d50121007b027a02b40031013201270027005c003101c3017501e0013a024102470239023a024702b900f6000a014c0018002b01370240023f0215013c016a011102ab018500f800e4009a0174028900b400c200b500b8008800f0016f0249015d016401f5005a001101c7009a004900e000210128010b020602fd0194013700ad012f0121012d01cc00c700be000f00100022003e004d005200a601950194013f0145013b014e01600166003b026c02710253028b000a01090286018d01680071001201da01cf01d60189007402fb01fb01850089009f011c00f201690073006500c900790075009d00ac00a600a6009c009d003f0244024e0204010c0109012302be01c301a700aa00b500b500b100a700410196010002560141010002620061005600c400620056001d0222021d0192011d021d0183006f00f9009b019801a201a20181019b016d0272023f013f0138016d0204019a017f01640157013800380041006401060052016601660146010600070199011001480107011001fc01dd011b02ed01fc011b02b60137003601a801b601360115008e004c024c0248021500ac01c6011b01ee00ac011b01c501b3016b01a901c5016b0148004000270127012901480093002d00200020008c009300b7001e01aa019a00b700aa01c601f000fd00fd001b01c601cd0003004200c401d301ce01ce01da01c4019f00ba00940003019f009400d400a101460146016601d400210216020e021f0221020e025001540134001b0050013400000147007b017b0110010001d0007a01a4016e024f0178010000180063006300260000003e0246024d028000ba00cb00cb007c008000290023003100310038002900bb01c701a5019201bb01a501a900bd00c0003c00a900c0004b00f2006302630243004b00d4012a003701d001d40137019c01b001bc01bc0193019c0154003500330133010b005400a100a500cf00cf00c100a1009e00a7009d0097009e009d006e00740078006a006e00780030010c0094009400180130017f0087001200d500020026012601b300d500680188018a018a017e0168016e014701420155026e0142015701540117001700190057017d01a701c801b2017d01c801b601cd01ad01ad013700b6015f01f901f700f700b7015f01de01e801ef0113020d0220021f0213022002b801d501d801d801c501b8018d009500980011008d00980074004e017a0088017902e300e300760288019900b60077027302990077022500fb01e701e701110225002d022a02340223012a013900ed0023013900fc01d1016b01dd01fc016b0171018c011a011a010c017101d300b901d701d701b101d300190105010d010d0171001901ce00c800bb00c500ce00bb0002028301f101f101f80102026b028b01700270026c026b02320160000f010f013f003201440153001f005c0144011f00a0019d0114011c00a001140159014400630263022e0059016c00f300620160026c006201c300a00014001300c30014001c01170128012c011c01280120020d020f020f02a5012002ec0040000d007502ec000d004f0057005e004b004f005e00b2011702b301b301bf01b201e101dd01e201e2013300e1015702860081005902570281009b00e5001f0114009b001f0130009300e800e800a200300049014d003e00340049013e0056025c024a024a02490256025d025e026d026d023b015d020200b600ca003c010200ca00ed012a00d401d401fc01ed0179028701e400e400e20079026f010801d400d4006b006f01de01260229022902df01de01f701f801e601e601ae01f70149013e014c014d0049014c01dd00cc01d901d001dd00d90101006f008300dc0001008300c901c101d201d201b501c9017a018a017d027d02a4017a018501cd01a80121028501a801a8011c0221027501c301720176017501720133001a026101e101330061011202040215021502d701120265007600700070005e0065007600ad00540254027000760092009100c60001019200c6001e0032002501250124011e0032022f0236023c0232023602f301f40101020102fd01f3014f004400520057004f005200aa009e002d00b000aa002d003900b0002d003600f40042005800360042006300c100a300a3002e016300eb00ea00e100e100ee01eb003e014e00090009004c013e0159025f024e024e025202590243011f0013004b01430113003d0238023002230224022a022a0228022302be007c027f027b02b400be007f027b02be0001012a01fd001b01fd002a01fd0004000101f701ae01740174017c01f7015c003d00450045001d005c0010021402610161011a02100280026a026f026f02690280022b0227022e0231022b022e020302f801ff01ff010c020302e901e801df01ea01e901df016800a30107010701710068002602d1002f02290226022f023b0173016e016e015d023b015e0116005b015b0197015e016d01ae01330233023e026d019c011c015800b0019c0158005800a400b001eb0180013a007f02eb013a004700000179017901e60047006600550056005600610066002b011d00a800a8004c002b0131015c00330133010b0131012701fc002c00ff001a0127012c00ff002701e501d100d200db00e501d20011000e0062026202810011008f0082008e0096008f008e008e0097009600080255015301ed0108025301fe01ba01ef01ef01f601fe015301fa0135012a00530135018901f20000026c023b028901890100026c02e800de00ee00ee00ed00e8003002e501ec01ec01e401300263017702b7016a01af016301b7016a01630127001a002f005c0027002f00670269023d0107003d0169023d0139016702bd01c701c801c801ca01bd017501820186018601f4017501900164028e018e019d019001020179017e00fa0102017e00f501da00e401e401ec01f5013a00aa01e7017b023a00e7014601410156010600460156016501060056012d023a023902c2016c012d023902c2012d02030218028f01020203028f012b011800640054000b002b01640054002b0178014f016e016e0173017801d301c401e700df00e700c401e7002100d301bc00a0008700ae00bc0087009601a10198018b016b029601960198018b013e023302390246023e023902b2007b0167014b01b2006701670143014b015f0052005b006a0069005f005b006a005f00d600d9008c003d02d6008c00110153025a015b02680211015a015b02110177016e0265027c01770165027700780072007c0077007200720080007c006c0172012802be012802720128022d026c0136022f02370237023f023602f401ea01e001e0017501f401f601e901fd0106020502f601fd010602f601dd005f01b6002201dd00b600b600fa00220197017802350137013501780235017e0097017f019a018701680171017f01870168017f01350059002d0134015d003500ce01340135002d01ce013500f501ec01ea00ef00c001f501ea00ef00f50150011b003d0107001700500150013d0107007500a8007b0016016d0075007b001601750039013d011000660239018a0010008a0039018a00720266027c02be000800ca0099007c020800ca007c0237009501bc0136013700bc01bc01d300360105004a00260112010d01260126010d010500240098003c00a9003c009800a600a90098003c003100240078029701a4017502f7007802a40175027802d7000e011401b900d700140108016f01b90014010801b9009000c200c6009100cf009000c6009100900042024a02500250024102420209004e016e005b004c0109006e005b000900eb00ba010402fb00f100eb000402fb00eb00900114020702840164029001070284019001a301680097017e007901a301a30197017e003c0243024902420235023c02490242023c0266025e025002500261026602180203020c023300220218021a02330018020c021a0218023d0248024c0238023d024c024c024002380241023a0234024202410234023402350242025100120115010d005e015100b7010d0051006a01b701510015016a0151000a01e6000201b9000a010201fa01d700b9000201fa01b900 34 | m_Skin: [] 35 | m_VertexData: 36 | m_CurrentChannels: 3 37 | m_VertexCount: 641 38 | m_Channels: 39 | - stream: 0 40 | offset: 0 41 | format: 0 42 | dimension: 3 43 | - stream: 0 44 | offset: 12 45 | format: 0 46 | dimension: 3 47 | - stream: 0 48 | offset: 0 49 | format: 0 50 | dimension: 0 51 | - stream: 0 52 | offset: 0 53 | format: 0 54 | dimension: 0 55 | - stream: 0 56 | offset: 0 57 | format: 0 58 | dimension: 0 59 | - stream: 0 60 | offset: 0 61 | format: 0 62 | dimension: 0 63 | m_Streams: 64 | - channelMask: 3 65 | offset: 0 66 | stride: 24 67 | dividerOp: 0 68 | frequency: 0 69 | - channelMask: 0 70 | offset: 0 71 | stride: 0 72 | dividerOp: 0 73 | frequency: 0 74 | - channelMask: 0 75 | offset: 0 76 | stride: 0 77 | dividerOp: 0 78 | frequency: 0 79 | - channelMask: 0 80 | offset: 0 81 | stride: 0 82 | dividerOp: 0 83 | frequency: 0 84 | m_DataSize: 15384 85 | _typelessdata: 1361533f9d1165becceee93e9f860b3f2ac89cbef3ce473f39b4883fc286873e904fc83b9de7563ff82bfd3efdc0663e4b59c6be79060dbdb4c8763fa813093f33bd24bf67060c3fdf4f8d3f8638163ebebc803d72bd693fc7bc843e9834a13e6abc943f2db0c7bbc0ec1ebe67217f3fba2a423debe8893dc4422dbfb072a8be62a1763ffd05c73ca1a559bec6127a3fe9484ebf6e34e0be14e8133d30e421bffe9645bf632a873d488a48bb39d625bfe5d052bf4c5bfabe4f7159bf2c604b3ee86a2bbeac8b1b3e5839943f0b31ae3e06fd5dbfdd3dba3e7b88863d9fab2dbf9d11a5bd35d1f8be6a2e56bf8861813e7c61723e022b27bfe4834ebf7439803d36f37ebf5ec385bde2e9053f5af599bee3360a3f476bfa3dec8305bfba2b583f0e2d92bedaac3abe516b0a3fac1e1a3fba2497be21ed3d3f764f1ebf5839943e4faf743f508b453f84d043bef04a1b3f4f1eb63ef46c26bf545247bf74c71f3d45f170bf56d9abbed191bcbeb762ffbe5bd33cbfa3c95fbec74c4cbf0dc30f3f77be5fbed8f004bf73d742bf50ada1bd1b2a71bfc1f0a63e1748003f39b428bf728a3ebfe012263e141069bfb5dfc2be96213ebfd3de30bf6ff0e53e58f2923e99b071bfc41126be5eba49bf27c206bfc139533ff48b59beaf5d2fbf3065323f3e7918bf16fbebbed509583fc96b043fd0d53bbfb38de13edd24863fe17ab4be812642bffee7b73ef63147bf92ea03bf865a33bfdbf99e3e54e3853fcdcef53daf4a18bfc3774b3f3cbdd23d1b9e1ebf0e2d32bfea19d3be98a164bff34b383e34a2443f12149fbed34de23e811eca3e2a9106bf3be9403fc3d36b3eb1bf2cbfc28627bf1ef477bea0e26fbf5ad180be5ad853bd2bf6b7be8863bd3ec1f7edbdd6a230bf53e5363f857cd0bd58a8f5be3d2c24bf7d7164be071d71bf59aa803e4e6250bfa60aa63e88ed13bac3fc27bf708b3e3f241dfe3d9fabed3ed712d2beb98de63ea8df533ddaca39bf529e2f3f1dc965bde44ee93ce09c013f27ee653d05fb873dd0077f3fa2b457bfe9b71fbf9ca2333f901293be49cc4cbf32db063f31088c3fdbf9bebe07f026bfca94d33ea21d62bff2d662be5e4b083ee370663d3411063f31d83dbe48021d3e157b783f925c7ebeb22eeebef2d21dbfad3785be695474bf73c9153ef5b9ba3e022b37bf76e01cbfedd944bd29c86fbfaba4b1be48bffd3e477239bfcff713bfb1c03c3ee7f070bf990191be0b24683eb5150b3fb81ea53ff44c6a3d03137c3f16c428bebb275f3f871619be12a5dd3eec0b213fa40590bd762e463f17b7913dd2009ebeb7d1e03e07185abec0530bbf81ba4f3f3f571bbef5dbf7be705f07bf1a5940bda54a7cbfd5df26be2731883ea3013cbf5ddc06bf6c647fbe62076fbf2d8683bee10b23bf98dd933eb515db3ecb981ebe06d2773f25f3493efc18f3bd98dd033f522cb73c326584be97bf6d3ff014883e7cf210bfaed81f3f23db793f64da773f2545f93d73ed5fbec1ca913f8e75b1be910f0abf32b1eb3e6cf95dbffef6423e3789c1be4d84cdbecc7f08bfae4511bf108f36bfe6c0d2be7654b53d39b4e8be3f359e3e658a65becf4e42bf0b7c1c3f1283a03f2506a1be68b30abf76cc053f0efa58bf6577bc3d46b6d33e257542bfb37bf2bea61f553ce1157abfd16f5abe5a643bbe5eba093ef853033ff210733e5b18683ecbd1713f780be4be3ee8f93e029ac8bd141323be24db7b3fa447a8bd3f8c10bd1136fcbec74bf7bee2a8a7be18a36dbf4a8a34be4a7be33e28b898bd8273163f5f5486bc02efe4ba17f77f3f5eba893fe3a51bbd228e353e3ed7683f2c77823c48a5d43ef7061f3f0378eb3e0000403e852b813e8ac4603f7e45d03ede718a3ea5bd41bfe9b7cfbebf7c84be8a1c73bf4bde34bea01a9f3f4a0c82beed9edcbec088de3e62db26bfdf1a1f3fcba105be5986b83e1904963f363ff3bebbed603fc781443d0534d13ecb1047bf9031b7be1558b03c73d97ebf15e0bcbd99bb063fd3de40bf43adc9be649b8a3e0e2e74bf063805be5b427e3e645dfcbe02bca53e3bd50fbeb70056bfbcd0073f6f1243bea1d604bf9cc4c0be737688bdab8978bf47c36bbeb66796bc910f3abed881f33e1ffd50bdc99d9abec0b2733f24b91cbf3ee8d93e39b4883f89d7223fc236c8be0d492a3f48bf3d3e20d23fbfa7e8a8beaac0b4be030a6abfdeb74bbefca9913f52b55dbbfa27383c55a5763fe02a5b3d2b60863eb37bf2be6f8104bf3b01adbebee80ebeb3a55cbf2d98f9be3d2cb4bec21706bf4df3aebee28575bd3d6272bf43dfa1be32e6ce3edaacfabe0534b13e71ab933b370756bf92730c3f29eded3e8fc245bfb98d86be0b20083e34937dbf3ded0c3d759388bfd656ecbdb459053fe6d97cbf722acb3d1487f73df5b93abff931e63e60e5903f91ceb2bd49e0e3be9927643fca3204be4260853e9318a43f5825f5bef73619bedc755d3fcac312bf8716b9be5396713fd1b4c73ea717e0be14644f3fc66d14bfab3e07bfd57889bef15a87be4f4163bf4cfcc0be7d3f353fdbf9debefbcbae3e0d17833e07ff43bf9f14173f857c10be83c00abf7dd073be4af750bebdef77bf161d12be9d80263e986e42bf666666be15edc6bebedb6bbf7bed6e3ca01aefbe24970fbf68b36abe7c1051bdc7ce78bf62496bbe26e4a33ec28647bf000080be760952bd2da87fbf5b83e53b1ceb32bf85ebd13d5986783fb7a16bbd70b2ff3dd1917d3f182693be96b20cbfdf4f4dbec7cb3a3dcd247dbfd63611bebe9f4abf371a30bf6132153f9404c13dc17a78bff4b0623e9cc4103fddb544bebc05123f16ee3c3ecbcf87bea944723fc217663eb8af43bf8941e0bd19df0dbe171476bf4c14743e2fdde43e7c6142bfb1bfecbddb50db3db54177bf329d713e8b6ce7be4faf14bf8716d9bdc3fb033d49dd7fbf4e5f953b79e9863f1b0de03d933a413e79b3593ff18d5f3e0f1af53e6210183f6dff8abd14d0143f43bf553e767b59bc73567a3f9eef87bff4fdb4bee3c7f83e7b2b7fbfe332a1bde00889bc250601bec52010bf4e45aabdded974be180f78bf18df7f3d2731883e567dcebe363cdd3e1bca39be8d2226bf77263d3f07ce993e2a3a12bdcac3123f1b363cbec5830a3d5f7d7b3f903117bf401311bfd5268ebda3595abe4a147abf6a3b823c6688a3be05c50fbffc523fbd4f11603dcc447ebfbdbad13d96b24c3e62a1d6bd4d150c3f1d8786beb94fc3bdb3cb753f9643eb3ef01638bf5011f1b99190da3d5c565cbf79e1fe3edf4f0d3f4a0c32bf8aab4abcd0b18a3e10495abfd3b8e43eff216d3f41f183be0de0ad3eeeb8353f6da9b4be320e1c3f1e163a3fadfa1cbe9d11053fa2d9ce3e42a44cbe6285643f6b9af7bedb8a0dbf65df153debab3bbd630b76bf5a6f8b3e6ff0a53ee2e935bfe0102a3c9d26f7bc56814fbfe7b9153ff085293f418222bfe9b7af3c41b7903e3d5e58bf5440e83ee78c58bf0395713d69006f3f641414bfb5f3913e06a9433fb7d1a0bea8570abf4eb9823d205f5a3d0e5873bff1a19c3eca3244be14ae07bf1b81783d6e69c0bc13ca74bf455f953e469476bf827346be014d043e420e76bfd2eb8cbef204a9bc2cd45abf401311bf143f863e202847be131a1fbff84642bf3f57fb3e341126bf1c99873d8a4aee3dd5e53fbf29ce263f28b858bd68910dbf2731883d0a4390be938d60bfaf16c73e6de78b3fba498c3e54e325be766b623f7e5bee3e2a80023d637f29bf204101bff016c83d5ab380be440072bfa5cf543e54e355bf08c9c2bdf90f793f7e6d8cbea82ca63d154e753f197357befed4b8be4703b83e46fa923db0d54bbf01c9193f0681d5be9cc400bf31992a3ecaa04d3d700e6cbf5773c43ea75ce13c547404bfd9ce373e5b604fbebe8358bfe9bdfc3e6a4d133fc05b10bf5227203e6126f03dffca59bf2827033fee7c0fbf1ac0fbbe5dfe433e9ebf413c59607cbf0b412b3ef93186be10e9f7beee5a423e93cf5c3d078260bf0b79f43e4bea04be85ebf1be0612543ef12cbfbdf3b65ebf6ae5f73e8a8e343fc13903bf1ac05b3e5a13513e7f3d59bf9ce2f93e764f5e3ef5b90abff5db573e32a80fbe29815cbfc6fdf93e5227c03e105809bfdaac7a3edf88d03c6b1765bfd520e43ea323b9beed9edcbe211f943e52872f3e86775abf590dfc3ecff793bd5a64dbbeea95923e8fad15be617e4dbf9203143fb84062bfda1b3c3e6de72b3f582c3bbf44cb2b3f1996fb3d925c1ebf48501cbfa089d03ea8ff163f4a0546bf526d6dbe7dd0b3bec729babe29edcd3eb38ec53e8e7756bf96d0c53e5e4b183f0ad713bf933a61bf092d723e77ee41bf69c21bbf2db24d3f431cebbedaac5abf8868173f381219bf9c7e0abfc1ca813faf25c43ecdcc0cbefc4a413f314c263fa13eb63d643b5f3fef38c5be68b35abf60680d3f4c2702bf771d29bfa5bd413eeb73f53e713daa3f682f383ff1ad15bf54eabf3e0bb5363fffb20bbfab3e57bf2905fb3ec44b45bf2166d0be7d3f25bfdf4f1dbf933a113f36381e3f88c942bfce674a3e8bfde53d7b832fbfd49a56bf1693fc3c8dfa7bbf1702323e8fe4323e3108cc3ed578993fb7d1383f92e425bfcf6e783e1973b7be128310bf3f575bbf845d893d311f7fbf9a91463dfed488bf4f1e56bef5b9da3e3c437bbfeec24cbd2e493dbeb4c8963f67d587bef0a746bff2affe3e38f5f7be874038bf74b5253f71ac1bbfbb273fbfc922c83e999b5dbf9f27a0beac8b6b3f3333d3beca5441bf617a073f1f6a3bbff99cdbbebec1473f4bc807bf5f293bbf35b80f3f055c45bf18039abead697e3fd34de2befa441ebb5550473fddaa13bf941e7d3e1b2f8d3f136183beb43ee53b7da5613f5d47cebe2e697c3ebc74933f4faf14beab21b1bd27317a3fb5f72cbe6fd9023e68919d3f3789a1beba6b29bf575b0e3fe2a549bf1cc687be477299bef4fd94bee3c7f83e53a8013fc3361dbf8ff21a3f14ae373f36cd1bbf744624bf6c44003fc3f64ebf541b9ebe516b5a3f6ff005bfad691ebfec71103f5c0345bf801199be3f577b3f90a0d8be454722bf345a003f98c253bf9ce981be72f91f3fed0d2ebf8f5314bf6773c03e2f7f64bf8f0e7fbe5c8f42be3cbd123e508d673f39cf2a3f22a3a4bed4ff2bbf0adcbabc2c65993e2b87a63fe959a03ee3d025bfe0cc313fbc9600bf5530cabe091b3e3fc4593c3fd68421bfdb157c3e7c61423fc9761ebf63ee0abfdf4b073fe24551bfb0756abec139633f5e4b08bfa1f801bf0c251a3f07bf47bf8a4a2dbebc74833f3333d3be470308bfd7bc153f06084fbf66527ebd5917d7be3411b6be5f071e3fb845433fc9540ebf1413a93ecc7f18bfaa8201bf780b343f3ac92f3f74c42dbfe944853e66f7543faaf1f2bea913503e0147e73e02ca41bf4cbdf13e48e1aa3f7fd97dbebe30f9bef478353f85ba25bf3c5b8f3e8fc2853fa60a86be9d80263e3579533f83f7b9be7ba0dc3eaaf1823f6de77b3e4f40133e2d60473ff7d2f53e1dabce3e5c8f623fcb1007bf88855a3d4009123f24d53dbf43cfb43ea913403fcff723bf0bb5e6be2367053f772f57bf3e8517be70ce783f5839f4bed95fd6be29fa2d3fe3ac39bf463ae1bd80480f3fbe9ffabeadfa9c3e09d6183ea05e57bfe402053f02bc253f6b2b36bfdb8abdbeda73d33e257867bf656adfbd14ae873f9c33c2be4df3cebe9d8d3d3fbcda2bbf906d073d2fdd543f5d6dc5be5ebaa93eda96fc3e775221bfd27e193fa9a45e3ffb3a10bf4b59c6be6821183f65854bbf9359f9bdfdf615bff38e03bf00919e3e1e74d83eadcf50bf3832cabe0e2d02bfc05b00bff90fe93ebfc7313ff32438bf60cf923c6f81443fb45925bf4547b2bee93d0a3f837356bf6e05a7bdae47913f840d8fbe1b9ebebeeb953c3fd0861bbf5717983ef2b0703f190406bfe63fa4beda2b1e3f32d946bf5413fabd85eb81bf02bca5be85eb313f3c7974bfafb940be4fda6a3efd87d4bebada4abed509583f11765d3f3a2a96be605cd03ed881f33df931a63e08ac8c3fd94e213ff8e230bf6f67b5be9cc4803fe948eebe97ff90be02e0453fc86e21bf47518fbde63fa4bee887113db3ea533fe716783f7bba21be7b0642be3eae8d3da4dfbe3e7593a83f3b73e93ec3c631bf80800e3fe7fb893facadb8be66f784be30f35e3fef50fbbe1ec8c83c39d675bfb3cd8d3d0a68623e4d8e65bfdb92e13e3fb62ebda1f8d1be151dc9be925cfe3e57922e3fb03b36bfaa212c3e6210583fe7fb19bffca971be9e6a0a3fd65957bfd96c6d3be92601bff016e8be9a081b3fe06a333f53a52bbff241793e3255303fb37b32bf1f856bbe9deaed3e336662bf0a40353d006f81bc91ed7c3e5eba893fb2df213fac1137bf3f8f98bed8f0743f666606bfe3a55bbe12dc263f081042bf205db9bcb29d0f3f894140bf75025abe39ac9b3e7a7673bfbc2a643ddb8a6d3f0ad7c3bea01a6f3e8de22b3f809a0fbfc1f2f73e4a0c823fde71eabe2a3a12be2d634d3fc45717bf3635a93d136133bf95d419bf637f393f0402bb3e8bd54fbf8138e93ed2001e3f58a835bf62d6cbbd946ab23e6e5d66bfc44f863e32776d3f83c00abf4a0cc2bd672d1d3f259546bf0977153ef6288c3f1dc9a5be000000bebc2e663f3c0adabefd8dce3d48fe60bd9f3c6c3eba499c3f668bed3ef63555bf19899a3ec7293a3fc7ba28bf6822ecbd7807e83e92c15ebfd13e463e2b18453f9cc410bf06d8c73d7ef8903e972e59bf0e08e53e7e1d78bed235933d85eb813fd357093faa8a54bf36dd1a3e5f29ebbe4260e5be30bba73efc49dc3e9c4b64bf39690f3e1e166a3db6f39d3e48e19a3fbc420f3f6b304abf668f803ee926913ff6281c3e84f0a8bd2f3f763f0f137c3e4398f33dfb3a503f355e1abf9d6340bdff53e13ed6c35ebf04ee623e83c07a3fde02c9be234afb3dcf653a3fca5e16bfefe4b43e24284ebf67d5073fd1228b3f68067fbfb91695bd2491443d492e3f3f68916d3efca971bfd8eca43e7d67583e423d6cbf4703383f8d28cd3e508d67bf84200a3f32b3dc3ee62539bfa913503f4547f23ef3ab393db931cf3e4e8d553f24d3bf3ea8357dbf128340be75021abc03a777bf917c7abe548a863d2653c5be13f2c1bd11365c3f88af573f362ed6be45c0ad3e3bdf9f3fed9e3cbdb6844cbf82fe113fdc80e4bb304852bfb6f35dbfbd52563ebc96503e59ea39bf44ff2d3f8e1fd33d96213e3f5af5f93e97904fbff4c3053f631b2f3f054f02bf2b87a63f5e4b48bef1f43abf54113c3f5d7eb4befa6514bf4260a53fa1bea53d68b33abfc706303fcd6af23e2bec0cbf4bea543f029ac83e029a48bfc0602f3f3841f73eb99f0bbff6977d3f1748b03e7d224f3ddd82333fc220263f042c973e6dc5bebe228ef53dd0d5263feff3493fa0d6053f7463a53e0456ae3f653648bd917e2bbf8e606e3f9d741c3d02a7b9be3b01cd3d1f85ab3ea69bc43e8e75e6bda9ce233f559c423f7446443fa54e403e1ea7e83ebc8ae23ea5c5c53e5d304f3f4013713f5ebaa93e17b731bf04fc263f0e99243f6d85cdbea08910bf5986783f022b973f9ca97c3f108ea2bde55f0f3e787a15bf62a1663f6210883f65f86c3fceee1e3e73a9b0be8fc215bf7593883f23db993fdca3123d360a783fc8b37abeb537d8be20d28fbe567d3e3f18825e3ffe04d9be2e69823e8b6c87bf056946bccff7f33eb33c6ebffd8fba3eff080d3d72e1803d76e05c3eb1e1e93e201c14be42b3e63e2585613fc976ae3fee7c3fbec66d14bf390c6b3f687cb6be4e3c31becdccac3f6093b53da69b14bfad87513fcd02103f3534efbdf853833ff7069f3e668813bfc9071c3f1832453f040440be4c37693fe63fe43e022b07bf842e333f8d15323f3db225be69000fbfd93df93e0d717c3f96b17b3fe7f43abed31ca9bbc520b03f280f0bbe0000e0be1bb1523fe30299be0a52f73e1283b03f24d14bbc302ae9bee5a0753fcd74123ee794783e6de78b3fd3bc833e0ebef0beae302a3faea53e3f85fa6f3dc1ca913f228e353e0ad7c3be31074d3f83f9073f5e918d3ec520803f9a08bb3e9031d7be1f08403f8729273ff227d6bd8d282dbf14aee7be9565a8bec8b2c6bec7da38bf2f9c12bf91ed3cbf234a1bbff6979d3eaa09633ea7d341bfa24e1dbfb6f38d3f840d0fbe20d2af3d55ed6d3f21a411be0c5eae3eb4c886bfde02e9be89d2de3e112079bfdb0342be46dd05be51da7bbf0f62a7bdac8b5b3e7bff77bfa8a9f83c6a1d7cbe13f211bf46b6933e865a533f5618523fac10123fd507fabc865a13bf0681853f986ea23fcc2f323fb674113ee42c343f14ae873fda1b9c3e09f9a0be9c0a543fe91d0f3f0a7719bd12a5bdbe810405bee4143d3ff12e6d3fb26b9ebeb84c5b3e789c723fe71de73e48509cbef22b313f13d5373f221196bdfca911bf9a770c3f7593883f11506a3f9700d3bcebd0cd3e8fc2953fd7fb0d3ce92691be063a6a3f7323163e8c82c03ee926913f6519223e348077be51f9733fb8999a3e1abcc33cb8af13bfb8af433f6666863fb7067f3f49e5783b294ab23d819583bf1895d4bd0534313fbf9577bf46cb453e6a5a293e5c8f923fa60a46bea08970be6f13763f11757ebe44bcf43d9a777cbf6649c03d2cd4fa3ea5a44ebfa2e2163fa02d04bd7e8cb9be20636ebe728a1e3f4a1c5b3faf599dbee7f2d43e068125bfb37b723f6abca43feb89cb3ebb8249bebc6f653fe3364abfb762bfbe8d976e3faa8960be6026cbbed52e643f44fa2dbf014de4be637f693f9f365b3dc91720bf8e4b473f6c0979bf93a902be1973673fed7338bf6c752b3e3e442c3f567d7ebfe202d03bfd825d3c6cf97bbf1ea9233e4d119a3db07218bfefc9533f6210983f7bfe553fdb378fbe49c8f13e8fc285bfaab786bd984cb53ea32171bf1664513edb6688bedfe0ab3ec3f528beea95123feaac0cbe1a9e3cbe5926793fb53738bf7368513f986ea23fc504153eb30bb1be134d6d3f7f6a3cbfa9a44ebe9a087b3f8d0814bd86afdcbd57577e3fbada5abf3945873ee1b4a03de2f636bf40192c3f8aab453eb51a123de21e8bbdce19013f4ab018be2b26d6bdffb77b3f333383bf50fc58be7dd0433f6a5779bf3b0d94bd4ee75b3ed34d82bff9a0a7be9790af3e99535dbf8521dcbdfa57fbbe29cb30bfbdfb63bd917e7b3fc80591bd41128c3be15a7f3f1283a0be40a4df3dc520903fa10b7cbe5a650ebf68324b3fe9486ebf4703383e4ce2acba7b165cbfc85c013fca5c983d55c108bf97cadbbc69007f3f5bc885bd624f14be83bf7c3f4694b63ed5e71abf46b6f33d6e4093bcef9b4ebf7316173fdbf95e3fa60a063e696fd03e99161a3f67ee913ed5f73e3f8941e0bd0c9389beae47e13e10c2883dba2710bfd5dc523fb45965bf6de77bbe4547723f075cb1be871a3fbe76596b3f3b012dbf5c20313fc3f5983f9945dd3e7a6ea0be6a79583f3bdf9f3fbc572dbb46b6b3bee90b103f57f64c3ed9544d3f4faf743f51f7813d20d2af3ecb2c3a3f3d1e263ef7bb2a3ff77560be17b7013fb81e05bd79a329be06ea7b3fa911853daef0ae3da779e73e7368b13f64a711bf7525e83ecaa22f3f0e2df2bedc68a0be0e2d623f0823433fa37df6be1386dd3ee5d0823f4887873a71ac8b3edf44533f09704f3d9dfd0f3fefc9333ffa7eea3d26e4033f38eebd3e52408e3e5fd8623f1ea7a8be11fc6fbddcd7213fe0196b3f3a3349bdfd0cc93e54e3a53f50e4c9bd5af5b9be88340b3fc4f233bec514523f2922c3bd0d71acbd80b7003fa1f1e53d10372ebe03a07a3ff7e461be36ab3ebdb5a6093f2e5bc63e340141bd0bb36b3f865a03bf39b448be8a8e743f78b5ad3ecbbc68be61ae693f32e61ebfd49a163fe926913f5111353fab650dbe297c313f4547523f27301d3c17d9ee3ec5e6113f829faf3d8c34513fad693ebff775103f8b6c973f20cc1bbe0c4798bec24a713f7593983f780b24be4ca6aabe59752d3fcad090bef6cb2d3fcdcc1c3f7b83afbeea04f43ee9bc8a3ecb111bbf6f833f3f8195733fcae0a8bdd044b83ef6733a3f225230bd2d122f3f5bb10f3f4b02943d4013113f18500a3ed7865c3e1097773ff853833f166a0dbef7e4813e836a553f7cad23be6755073fd7a3303f6808c7bbffb20b3f68bdcd3e6361a93dd176693ff90f29be591737be917efb3ef3ee733ef9d6a1bef8176b3fa1d6743e5bb17fbe6666063f5fb771be7f26cfbe942d623fad69de3d931844be0000003f793587be2c288abe650d6d3fbde3d43eceaa8fbed1220b3fbcb3b6bd606cd6be1858673f80b7a03ea184993dc520103f37bc0fbe0d3a323eba84793f5d6d45bf9487853e0612143fd217b3bee4d36f3fbbef9fba4faf343f77beff3ee2af893dd9cf8d3e6b18573fb0aeee3e29ed1dbf68b38a3ef7060f3f6c2db83d0f277e3fc678a23d73d712bf5e4b08bfeb7365bf8c8648bf55f30fbf9ab387bea8c64bbe4ca60abf637f69bfedf189bde2bd48bfb8ed1dbf819533bf3d2c04bfc66d34becf20d9be51a760bf411b65bee63f14bf4f1ed6bed26f5fbfc62e7abffeb2793cd57e583e7368d1bea4a5723df0a7863f2d3644be9c8fdabe2b3f623f4182e2bd61c313bf7d3f55bfea30d0be651d68bffc7ae53d08e6683d69002fbf03098abec5d722bf965143bf3fceebbdd26fffbe88f40bbfbd5256bfb9dfdebeeb384ebf28d1cd3e60767fbf39d615bf2428de3eeb864dbf36fd15bf9efae1bdd0d566bf3b01adbe6b9a37be76f249bf9bf504bf5c3aa8bea5bd11bfa06c4abd6ff055bfdcdb36bf487bbcbe515f183f33c471bf4d150cbf3cbd323fa4d929bfcd9603bf3c2e0b3fcc7f68bfccee29bfbada0a3f7c0cf3be5bbe5ebfa4d4073e6de7fbbeddb5e4be053441bffc0625bf2390a3be78cd313fbe3069bf05a3b2be309e81bdf9d94dbf362b18bf0e971a3cc364eabe8e9257bde4833ebf5e0c54bf028997be3c90f33e9f3c7cbffbcb8ebe2041613fa2794abf61df43be3ccd143fcf2c09bd92cb0fbf711badbec8cc02bfa94d4fbf49af93befbcb7ebf1e16aabead694e3f543f65bf889ca4be04939d3e6b9a77bf38f8e2be9cc4403fb86743bf2aeee3becfb4ef3e257502bd96431bbfa16733be57c810bf7c3751bfc49be2bd014dc4be0e4fcfbea2b427bf35cd30bfaa6e05bfe958003f302a293e6dc51ebfb16d913d6fc45dbec6e04abf59f4113f3e79d8befbcbeebd83c02abfacd57bbf969fc3bd18d01bbe93a7ac3ba32309bf827326bf9e3df4beb9ad4fbf831dad3e39d645bf925cdebecc5d8bbe02dd13bfcc4d33bfb9afd6befdf655bfb150cbbe04560e3e8cc633bfb6dc2dbff9ac5abeaa8241bf569f8b3e7ac7a93ec5f7d9be86d5643ff9db0f3ebb7e813de4830ebf71ac0bbf603b31bf0da838bfc4c4a5bca16743bfca54a13ed0d5163eae710fbfd3534b3f5e97703e60e550bfdbf9debec3f528be1e2b2cbfed193abf7f010ebe4f40133e03782bbf5ddc06bff8f014bfa5b84abfaf033ebe7ac769bfb1e1c9be05c55f3f1930ffbe0b9b04bf09f7313f6a4d93beecc0f9beaa60f4be78146abedfea68bfb752b1be598668bfc1caa1bed93d393e195259bfa64bc6be6825b8be7a364bbfa323b93e5c8f823f247174bf842601be13b8893e19e278bfb9fc17bf5ddc163f0c5d40bf64dc17bf2fed933e40c1453dca3214bf4260e5be374933bf112023bfc4b6a4bed95f46bfd0d5563e0bb5763f841007bf779b25be557e553fde71eabe6abc343ea69b443ffb27203f78a0473f33a5bdbc917e3b3ee25837bf6dff4abca58293be3dd04abfadb4093f8a8e24bfc807dd3e2428febd0933c2be25c66b3f1020b6bd44fa5dbfd1222bbf4469cf3e137a87bee49467bf9315abbe60e5b0bea089703e29cb703f9fd6bebecbd46a3f1c6a0fbeaa82d13df6972dbf1ff4ccbec04018bf98bb3fbfa29495be348037bfa69b04bf17b7d1bcb5a700bfcd5b5cbfdb1ba53de7fb69bf6f12a3be707c6d3d401754bfdf310dbf20ccc63d46b683bf3bdfefbe58ca123f09346fbf50c083beb64a7c3e10e947bfa7e8483fdf4f8d3fc0ac64bfd5d6a43e60a2a0be42cf26bf4a468e3d569f5bbfd25468bfde4d99bb1d01d73e12a5fdbe6ff0053e77be7f3f1f12c7be0dcfff3e1d2a463fda1b9cbe2aa9d33ea2b4973ef79c55bdaecf623f31ebeb3e90a098bee63fc43e89d25ebf033226bf96763d3f41b9333ec3f518bf9031373e516b5abf2da538bf8ace1a3f70f0ac3e204101bf5f984cbea69b54bff37a66bf0b02333c0fc6de3e96437bbffa0a52bd1cebe23d8ae97ebf8d0099bc51acb83dfdf6053f4625b53e87a7d73eb8f9b23d701f313f8e79373fc9764ebfbc96403f83c09a3f8aee3cbff00689beb8931e3f22fd36be5f98ec3e55304abf02072bbfa2bd133f457cf03e87a7f7be1ff4acbe33c441bf090853bf449ccd3cfdc6103fc1a804bf247fb03dbe3039bf18bb5ebfb4e1cb3d4934f73e2a00c6bce3c7083fa4df2ebfdcfe31bf5915353f9860023ec520b0bdde71ca3e787a25bfb3833abf98ed1e3f2731943e6132f5be15e5d2bbc05b20bfe53647bf52f93fbea67219bfe258d7bec3d38bbe006f21bfd25976bfb3e080beb7e2d2bd4df37ebf7ec6053db8af233f551160bf76efdb3efe91633e668843bf70ce183f5396713fee7a5bbf0ec6173efa62fcbedd2486bf6f8184bedd24163f817a7bbfaced76bd9463353e789c02bfcac3023e99bb16bf04b338bf3c4ca33ed5561dbf3789c13d4f40f33e5227603e44b94cbd1e905c3f8552013f075f48bf4d152c3fdd24863fab1973bf8dbd243ea1b989be0b2448bfd881633f9cc4a03ff59e62bfa1bfc23e7c12893e6f8184be8fc2753e022b973f00b725bf8332a03ee1ed313f9fcd7abf056e9d3d2cbc8bbd530c74bf867b943e6d76acbdb54f47bd5249fd3ec3f508bf8d8858bfa1b5f13efe597ebe8d28edbdf931c63e9a9909bf619c09bfa9444a3f78d296be061224bf7aa52c3e7fd9fdbe4d4ffbbe1d48d93ed0ca42bf5af5d93e8cdb283f16c17fbc3fba3b3e038f403f5b08223f5ef4153d4772293f05a302bfc25427bf6b42313fec669cbe80b730bfcc5d7b3f5c8f923f16a53abf92b71d3fc2a498bed6c52dbfd0d5663fae47813fae5012bf8660103f939618bf401321bfc0ecbebec0ecdebe891cd4bee0450dbfaf4839bf591737bf569f3b3fcdcc6c3f03ea31bfa856a53ec17624bf17b761bfe691bfbd287eacbef9974fbf4ad38cbdd4c314bf1b2f4dbfef38253fcff7933f6a3466bf850ac0bd2ac6da3e2e0439bd04561e3f1e16cabe1ce64abf153e0c3f4f1d89be93a962bf53d06d3d1d5aa4becf1050bffebe543e40570bbfa91310be74b5f53e08acbcbe43b10cbfb45d413f1dc5b6beb6f34dbf0a68623ef016a8be50292abf1506f73eb30812bf42cfe63e772de13e93a9a23ed4d1453c569b5a3faa2e053f1826d3bddb8a0d3f43e7b5bd42bd12bf7b084b3f15f2523ee4834e3fef38853e6519c23ef85a033f6d4c183f79631e3f2506113ff5b9da3e92cb9f3e8f6c543e6ede5b3f4dc7ef3eb37b323ff7e4c13ed34da23e6adbbc3eb4ce4c3fff43f23eec5168bf34a274be006f81be247454bffc3a84be8a34fdbef7064fbf23db793e38f8523f63b156bfe4120b3f1d24213d014d74bfc5038abdf85363be97a865bfaa581ebd1e58e1bee5d082bfa9a4cebdb29d4f3f485b6ebfff1e7b3e55498a3e3f572bbf8195833faaf1a23ff6a519bff5eb373fdc02b43e8fc275bfe38d4c3d34a234be8b196bbf1ae13e3e2bbdb2bea4706d3fba494c3e5c8fa23e6b132a3f1019e33eb2001a3f48bf6dbf6744293e1e162abe0f525bbf77b5d13efd7fa0beeeb1b4bd2731183fd50968bebf7c4cbf6a51193fac586abd0b4645bfa301bc3e492effbd05e609bfa61a573f3b187dbd287e5cbf60e5903ef77520be2b1c43bf35501e3f972944be6b9a77bff8c264be956508be72f86dbfee328cbe87bb7cbe77be7fbf1a178ebddae6c6bd32507cbf0d62f8ba0b262dbe1ceb72bf9f76f83c36ab4e3f484b51bf7142f03ed3e3aa3e539641bfc05be03e7dd0633f19c23dbf57bf943e59e81abf7b3194bc04562e3f3cbd12beb6401cbfd11f3c3fd865973e560e2d3f01dea23e3cbdd23e4e8f9e3eca14273f0704313fc1ca613e21b0023fae47213e18a7f2bce08f5c3fe6bb013f3480173f3ee8193f5a2f06bd9dc6a13eff964e3f6b73ff3ea54e80be9fcdaa3e9a99d93e0707983d9bf93f3f6d49283f57ec2fbde483be3e7593a83fa03615bf513e1a3f6c920b3f8b6c273e4a7b033f6666b63f0a6e023fe7a9ffbe7d65333f5ebaa93fb762bf3ddd24e6be95d8263f03ae143fe8bdf93eba49ec3e0091fe3e7c61323e59e5f33da4c5653f345cd93ee10bf3beed0d7e3e20634ebfae3e1ebf34c6353f71a8ac3e8863bdbe29ed4d3ec3f5883f833e2fbfab98053f334c023ff4fd743f5ddc863eb29d6f3eda8f273f7f3e073fdb720a3fe17a343ff775103fecfa85bd0062d03ee1435c3fcc039d3ef775e0bc984cf53e01de423e338ecebde9c6663f0983d73ea24536beaeb6e23e355e7a3e213a0abd2f6d643f4c80e63e2a3ab23e82e2073f431ceb3da64d0a3d9b7d5a3fd120053fc4b1ae3e211ff43eea95723ea19c0ebda8d55f3fdcd3f73e9cc4103ff90f093f399c793deae94a3eda47563fd88f023f827306bfdcd7413eaf94653f63bb863e22175b3fc302e43e302a29bea779873e9fcdea3e1d9b593e457b013ff908563fe86a6b3fd3dee03e855feabc604c103f5e3e483fb0e3873e302a493fceaa0f3f166a0dbfe9030d3f61de523f71b309be865a53bcea04143fd6ad9ebc705ed9beacb63b3fd2f7073ff7064f3f3ee8b93e5bd37c3ed9f4d13eb0f5433f83e4fd3eb81e853e3333333f569f2bbd02190d3b4911493f21741e3f787a25bea245163f7ac769bf027424bf9680423f9d86cd3da38f793b7c61d23e9a089b3ef74504bdfab7463fb92d213ff2d29d3f45d8303e499d00bff5f40f3f7faa4c3f154e583e67d5673e8f53b43e8351c93e33ccf3bd97d9333f409d333ff31fd2be13f2a13ef5b96abf3276efbed84a563f555191be43ffc4bda5bd113f38f852bf84b8a3bef37c643f77d3a23ec9767e3e71ac8b3ef2d2ed3e4be50cbeb84b0f3f5731513f99bb16be091bbe3ed95fb63e686d983d67f2443f2d6f223f08ac9c3fadfadc3d1ff4ccbe0d5c073fbdf90f3fd9bd223fd53e9d3d1b0d303f5d3379bd803090be670f3c3f40061e3f1a51da3d728a0e3f8d0b873d1c6012be19cd483f96841a3f4b59463ea392da3e910f9a3e165981bdf8fd4d3f9b22173f22fd963ee258173f143f463db207ea3b1bdf353f6327343fccee693fac1cba3e3ee8193e81e20c3fd24f393f770bd53e903197be520aba3d1b0d103fa5c5153ff903553e76ab483f3945e73ea1d6143f459e243d71a2173e3265413f8d64233f423ec83ee2e9153e2db20d3f8b4289bd58689d3e1fff723fbe9ffa3e5839343e6de70b3fae78ba3da85ecf3e41e6683f3cbdf2be423e683eb1e1193fdde0b33e09105c3fd7f0bd3e8fc2b5be7368b13e9621ce3e794f95bdb2784d3f438e173f3e79b83eed0dbe3e1ea7c83e498d9bbd8c4f3d3fa13a2b3f2f6e633eb1bf2c3eddb5043f3aa54cbe2e6bb63e43aa693fa167f3be7593983ef931e63e37151fbd7880643febfde53e8c1535bd0ad7233eaa60f43e316f833d1e47b43ebf0a6f3ff1f41a3f569f6b3e6d56fd3ef8875f3e14d2f53ef57f593fc4424d3f90a0083f01de02bee922ec3e6c665c3fcdce5b3e22e010bd91ed9c3e83c0ca3e0954703d8d43153f3a704f3f772da1be58a8753e73d7023fb80c853e8c5a1e3fe4d33d3f36cddb3ef931863e12a5fd3e1f9ce4bcac0d143f00b9503f7e1d983eba490c3f0b2468bf00a50f3ec664283f4f723dbfc7293a3e5c20113fe78c68bf573e823d8c993f3f98ff28bf363cddbe83c0ea3e9be61d3e09bc24be1fdf703fa096983ef54a193f6f12033fc05b60bfbca47a3e5b7a3a3fd1d023bf6de7db3ec8070d3f04565ebf4754183e396d423f9b1f22bf40a45f3d8cdb183fa32359bf78f722be079e763f2b205dbedd2406bf32e6ee3e855fea3c826888be431c753f80fee23de9b7afbe52b8fe3ec7bab83c8cd0ccbd652f7d3f691edf3d5beb0bbd0f9c033fae12ac3d207f45be78a6693f0174b83e3789913f006f013ec58f51bf76cbe83edc5fed3e8aae42bfca54613fccee893e819553bf4df00a3ffac1043f262329bf865ab3be64cc9d3e591747bfc5eceebe0efd5a3f8516663e9df4be3d0e4fef3ecdcc9c3fd34dd0be6033633fe7905dbe95d4093f5e4b183f24973fbfcfd95e3eb0c9663faf82bfbe9e5ec93e6abc243f73d732bf43aa2e3e43fe6b3f702cb2be14d0843e4013213ffdf645bf1b2b1b3da81e6b3f9e99c9beb7d180be234a9b3ee17a843f9292e2beccf6643fbe4f85bda245863f7d3f753ef2d23dbf9d61e03e6f893c3fbeeb03bf583914bf86c9b43e4f1e963e3cc293bed519613fd7fbc13eb4c8563f58a8f53e89d22ebf30572b3f58c12a3f6295a7bece88323fe5d0123f925c2ebf4b86b63ec652623f8bb99abee4149d3d96212ebf48506cbfe6af71be0ab956bf4a3bfbbe3d9b55be560ead3efb3a30bff9ade7be370f5e3f46ea533e7f6a2cbf840dcf3e2a3a123de9cbe9be85c35f3fa1bb293ef0a7863e80b7303fd6c51dbf476245b8bceb703f3720adbe228ef53d226c283f61c323bf8177adbe8b2b663f83ea8dbec3f5983f60764f3e984c25bf92490b3f9ae24e3fa1f266beb37b023f58a8253f8bfd15bf8f9e783e564f723f5a9359be90a0d8bec4b16e3e992a28bf52423cbf4b7a2d3f28c1d6b9e71da7be7f6a9c3e8c4a1abf7138cabe31e9653fa12346beaed80fbf9cc4803e764f2e3f7b17ed3e28b3623fadd917bd09f960bfaa82513ea7e8e83e99e127bfcb3b413f78d963bc8941603e9cc4003f48e19a3f5c5d573fc3e4b73e4ae1cebed5e7eabeb150cb3ee17a943e01734fbee4c65f3fb302e23e9d11a53eef38353f948705bf4c024a3e8dca743fa95e5dbe5ddc263f8e06203fee7cffbed63dac3ee7ca6e3fc98004bee926f1be6f81843e9eef07bf7bb7dabead932d3f7a2019bf52b84ebfd734afbe1d5aa4be811225bfc08af8be512417bfea95323ed2003e3fdfe0ebbe45e7c6bd13aa733fc6ef94be1dc965be07ceb93e136103bf420e8bbef440643fc37eb9bec364aabea54ec03e772de1bec66284be5180593f3f5aebbed0d5463f01de123f70cec8beefe5093fc575573f4aa31dbd5ddc063fb6842c3f57eccfbe18378c3e0f45743f19fef6bde926d13e6688333fbe30d9be288f813e418f743fbb781cbe0c021bbf226c983e5a64dbbee058dfbe26ae1c3f23de28bf79e926bf363cbd3e5986383e2673d9be9f475b3f7015963e41d47d3d3f353e3f9d11c5be2027f6be4d21573ff22c80be13f2213fd42b253f0e2db2be7832c73e50c36b3fe0e8b4bc46b6933e3b703e3fe3c7b8be042e4b3e0c0f783f3de016beb459f5be5474c43ec217c6beebce35be0380543f235407bf6519223eb459453f88f49bbe30fba4bdecea7e3fb3cc34bd2b18d53ed044383fd7348fbee71e8f3ef980753fa3543fbdce6f983a5452373f04568ebe4cea18bfb84a4d3fac0e37bcc3641abffb5ccd3edbf99ebeb2d2b8be02b0543f69e3d8befd87343e029a083f4e62b03fdfdbd8bed00a673f3eb59f3d3d2c543ffa7e0a3faeb682beaa05053fb4475a3f7e5f5f3d4e62903ea1f8413f917e7bbee9f41e3e4fe57c3f61a03d3bfb5c3dbf0de0ad3e560e8dbe972d0abf06d43a3f9cd4d6becdcc2c3f44fa1d3f1c7c61be911fe43ed457633f8502e83de3c7083ff7062f3f355e7abe2184b23e01cf6f3f3592f93c6c0939bedaacfa3ed509e83df3cfa0bd5b80773f68ff783ea4709dbe6891ed3e0b4685befc522abe755c6f3ffd5ca0be1ac09bbe8e75f13e5305233e890191bd62d6723f78f49d3ea60a06bfa857ea3e764f5ebe81ae33beec18713f1cd692be2e9010bfd122db3ebc96103e9820a9bed852643fdf279e3e3411163f74b5253fcdcc0cbee076d33eedc0613fa8f6683eb1bf2cbee5d0023f6b2b36be16b3d0beba69673f365f04bebe9f6a3fcff7f33ee9482ebed387173f88584c3f1db4e43da52ca33e840d3f3f637f19be0f89353e5244753f717e663ef2d20d3ed34d423ff8c224bec3f82bbe8ca4733fbc8a833ea779e73e6a4d333fb30cf1bd73e2963e76986a3f1eb38a3ef4fd94be2d21ff3e4703f8bdb4d9e4bd88db7c3f4c89dfbd598b8fbdd881133fb45975bf0cae4d3c29b6193fe9b04cbfa9fb803d789c023ff93176bf7012953dc2706d3e1e5378bf8885ba3e2575e23eb37b72bfec3e133d1576d73db6697ebfe4831e3fd34dc23e0bb576bf4d2a243e4a37713e366375bfe02d503e3108ec3e7dd073bf54981e3dc86136bb9ace7fbff1f44abea913003f386774bfd02d1abfb2aed33e42d22ebfa54e003f29edcd3e26e473bf29aa0fbd2c6a863e7bdb76bf57b2a3bda1f8d13efb3a70bf07edae3d44e519be66257cbf6fd39f3d6744c93e24b96cbf679eddbb8157a2bed2c872bf09f9e03e65aaa03ec8076dbf7a9a33be1d690fbeeb7779bf4b5986be3333b33e6f8174bfb65ac5bc39ce3e3ee2707bbf8273863e8b6ca73e19e268bff0937ebda5df4fbe082a7abf789c123fbd52563e0f0b75bf2bfbc8bdc2da363c90bf7ebfdc68703fb9fc073e9d8066bf308eb43e1828b53ee0c45dbffa0a523d6c789a3e547464bf288f803d237209be882c7dbf0309ca3e287e4c3e273168bf28182dbe0186353cd44c7cbf454702bf5227803e211f74bf556d08bf1ad8423fec4ebdbec87b95bd79e9663ea8576abf02533c3e636f203dfe6e7bbfc58f313e4b59463e061264bf23ee663cd444033dd3d77fbf4850fc3ec009853d5dfe73bf187827beff1a6e3d4a1d7cbf88f43b3fc3b6453d591777bf7719a73d9bb66a3d73b97ebf8c4a6a3f1edc1dbdc1ca71bf90c67a3ee7990bbd140d78bf917edbbe12143f3eed0d7ebf0b5f2fbd200d1f3ecba77cbfeeeb80be55302a3eec5178bf1fea423ee03f4e3d1efd7abf13f221bf832f8cbe917efbbe0510c0bed9d1b4be8d685bbf23db993e96e7813dfe6567bf07dcadbd18fc713d8ba07ebf96438b3fb58993bdb37b62bf8599cc3ecf5feabca68e6abfcdcc1cbf4bc8073eb98d76bfeb841cbf849a8b3e112c3ebfe3a50b3f52499dbdf46c76bf08aec8bd269d0dbd3f9d7ebf2aa9433fcc5d0bbe2b1875bf5f661a3efa94aebd6b217cbfa08930be3ee8593c9d1175bf5f3b3e3e7ab80d3d41637bbff54a593d917efb3bfa7e6abf1353ee3d46291f3dea107ebf77bebf3eba2c26bda4706dbf14845bbefc4ff0bba20a7abf2f6e233f88855abe0bb576bf04883fbcc5e739bdfab77fbfb22ece3e764f1ebecdcc6cbf32c146beb47cf0bd6c5379bf12a50dbfcf49efbc9fab7dbf72233abea9dc0cbdc0947bbfda1bbcbec347c4bcb1bf7cbf6468ca3d253142bc84ba7ebf96438b3f0ad783be470358bfe93ac03ee660d9bedfe952bf5305833e3b010dbe1d3867bf70efc7bc5de40abdc7c67fbffe0ec53db5a639be871669bf191ae43d4656cdbc86537ebf3945473f43ada9be40a46fbfcfd6a73ecb5645bee1c46cbf2f6e733f4c3789be29cb60bf6eb6a83e79c9afbea92761bf061224bf7ae40fbd3bdf6fbf18306dbfd2758dbe03c582bec58f013f8cdb88bec4b16ebf85af5fbe86fbb1bc6fc179bf67d5e7be5a643bbee4147dbfc7bdccbc247a11bd2cc27fbfa3013cbea8354dbeeb7375bff64f173ed211bbbc4a1f7dbf64ccbd3e31998abe39d665bf250e02be34e15bbd038e7dbf6f12233f0f0bb5be304c76bf5075c53a835210bd3bd77fbf24977fbfa8c64bbe16fb8b3e8fd967bf46951ebe7d16cabefb3a40bf3411f6be8104453ec3f920be1f0f5fbf2800eebe736811bf2e9020be136173bfed2367bfb0ceabbe648f89beec51783ea5bda1be39d665bf3a0c193dc0c5b53d6acf7ebf006f313f4ed1f1befb3a70bfb62f983e828ad5be81e05bbf6b2dcc3bdfe08bbe9fcd6abfc83c363e2bc502bcb5e77bbf014d043fd6c5edbe819573bf022214bd0d5b9bbd2c187fbff77500bf42cfa6befc1803bf0165dfbefbeafcbeb68740bf190466bfdc68e0be8e06703ef89816bf31109bbe7bf33fbf3c4ed13d96b2acbe9eef67bf00c19c3d477a1f3eb41d7cbf448b0cbf51da9bbef9a077bf6aea47bf4eb3ecbcf1bb1fbf23dbd9be6891adbe7f6a7cbf94f8fa3cb64d9dbd8b1f7fbf4a7bc33eb98dc6be470368bfd4fdcebd16df583eedd978bf9ca273bf7cf210bf363c9d3eb81f12bf0d580dbfef941bbfa9de9abd711bcdbebc9670bf58cea63d1632f93cd5077fbf14d0e43efc1813bfcdcc6cbff5d5d63d2e1827bf2f1440bfec51f8be4b59e6be9031d7be65ea94bee2cd3cbf61071cbf54e345bf857cd03d8ab0e1bedbff21bf7b9e8b3ee98539bfc3f528bfa4a5723cf5db07bf52a0f8be30377a3d583e5fbfc05ba0bed6c5edbe8fc275bfae40e43debd47bbeec7d76bfd4488bbd863806bf98dd73bf5e340dbe4b985ebe4f5f77bf378981bf8d28edbe5ddca63e95ea4ebf100a3bbe074d0fbfc503ca3c956518bff85373bf0d996ebe1767cfbebe5362bf67d5a73e16fb1bbfc3646abf39ab2f3ed16b36bf90272ebf742457bf85eb51be075fb8be191338bf00ca75bea1f626bf728a3ebfa1f871bea54ee0be904518bf3264abbe07193bbf2db2fdbed200febeaa6074bf4964a1bebeaeb0be7f5162bf917e0bbf52491dbedbf90ebf8f32fdbed85453be662458bf857c503e2fdd24bf29ed6dbff25a523edd5513bfaaa34abf8cb94bbf54573ebd5396e1be1f0e2fbf2d6ad7bcfeab3abffd8734bff01608be053401bf2f31f2beaa9121bec0e65dbf0e2dd2be33c411bf560e6dbf1d5407bc0f2953bf63b710bf4ca64abe4013813e3ee8693f4265013eae321f3f34da45bf8273463e36cddb3ed7a3903fa5acfa3e0726e83e61aa3ebf637f19bf4ca6ea3e764f5e3fa828353f1277763ebf0f2abf0ad723bf1d5a543f09f9703f81acff3e8b75e13e30033fbf7a36abbe44fa2d3ee7fb593fa3796a3ec30b1e3f41ab40bfc7292abfd1919c3eff213d3f137ebbbda1e25e3f4c75f7be75021abf60e5803f713d8a3f3f3f8b3e8044353f3cd326bf8e75f13dcb10c73e48e18a3fc1b5b13b4e83293ff2d43fbf11d5a5b9d95fb63e2731883f1fbd5bbd2cd3343f42b134bfacadd8bd7446543e4772793f7c86403f7a000fbf331db3be4c3729bf8273163fa3015c3f2c020cbc8d4c253e13a27cbf728a1ebf62a1363ff0a7663f6c00243f72e2863e33a338bf3f35debd80b7a03e48bf7d3f5d7c303ed678423fb88720bfd0b3593e3e79f8bebc0572bf3eaa113d1d77b23d15dd7ebf 86 | m_CompressedMesh: 87 | m_Vertices: 88 | m_NumItems: 0 89 | m_Range: 0 90 | m_Start: 0 91 | m_Data: 92 | m_BitSize: 0 93 | m_UV: 94 | m_NumItems: 0 95 | m_Range: 0 96 | m_Start: 0 97 | m_Data: 98 | m_BitSize: 0 99 | m_BindPoses: 100 | m_NumItems: 0 101 | m_Range: 0 102 | m_Start: 0 103 | m_Data: 104 | m_BitSize: 0 105 | m_Normals: 106 | m_NumItems: 0 107 | m_Range: 0 108 | m_Start: 0 109 | m_Data: 110 | m_BitSize: 0 111 | m_Tangents: 112 | m_NumItems: 0 113 | m_Range: 0 114 | m_Start: 0 115 | m_Data: 116 | m_BitSize: 0 117 | m_Weights: 118 | m_NumItems: 0 119 | m_Data: 120 | m_BitSize: 0 121 | m_NormalSigns: 122 | m_NumItems: 0 123 | m_Data: 124 | m_BitSize: 0 125 | m_TangentSigns: 126 | m_NumItems: 0 127 | m_Data: 128 | m_BitSize: 0 129 | m_BoneIndices: 130 | m_NumItems: 0 131 | m_Data: 132 | m_BitSize: 0 133 | m_Triangles: 134 | m_NumItems: 0 135 | m_Data: 136 | m_BitSize: 0 137 | m_Colors: 138 | m_NumItems: 0 139 | m_Data: 140 | m_BitSize: 0 141 | m_LocalAABB: 142 | m_Center: {x: .154999971, y: .14380002, z: .216299981} 143 | m_Extent: {x: 1.22399998, y: .923200011, z: 1.20869994} 144 | m_MeshUsageFlags: 0 145 | m_MeshOptimized: 0 146 | -------------------------------------------------------------------------------- /Assets/Meshes/bunny.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ebf10be2ce31844e4aed5be5de97b27e 3 | NativeFormatImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8d6b40fa684f34e878369beb619c7161 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Scenes/Sample.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | SceneSettings: 5 | m_ObjectHideFlags: 0 6 | m_PVSData: 7 | m_PVSObjectsArray: [] 8 | m_PVSPortalsArray: [] 9 | m_OcclusionBakeSettings: 10 | smallestOccluder: 5 11 | smallestHole: .25 12 | backfaceThreshold: 100 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_Fog: 0 16 | m_FogColor: {r: .5, g: .5, b: .5, a: 1} 17 | m_FogMode: 3 18 | m_FogDensity: .00999999978 19 | m_LinearFogStart: 0 20 | m_LinearFogEnd: 300 21 | m_AmbientLight: {r: .200000003, g: .200000003, b: .200000003, a: 1} 22 | m_SkyboxMaterial: {fileID: 0} 23 | m_HaloStrength: .5 24 | m_FlareStrength: 1 25 | m_FlareFadeSpeed: 3 26 | m_HaloTexture: {fileID: 0} 27 | m_SpotCookie: {fileID: 0} 28 | m_ObjectHideFlags: 0 29 | --- !u!127 &3 30 | LevelGameManager: 31 | m_ObjectHideFlags: 0 32 | --- !u!157 &4 33 | LightmapSettings: 34 | m_ObjectHideFlags: 0 35 | m_LightProbes: {fileID: 0} 36 | m_Lightmaps: [] 37 | m_LightmapsMode: 1 38 | m_BakedColorSpace: 0 39 | m_UseDualLightmapsInForward: 0 40 | m_LightmapEditorSettings: 41 | m_Resolution: 50 42 | m_LastUsedResolution: 0 43 | m_TextureWidth: 1024 44 | m_TextureHeight: 1024 45 | m_BounceBoost: 1 46 | m_BounceIntensity: 1 47 | m_SkyLightColor: {r: .860000014, g: .930000007, b: 1, a: 1} 48 | m_SkyLightIntensity: 0 49 | m_Quality: 0 50 | m_Bounces: 1 51 | m_FinalGatherRays: 1000 52 | m_FinalGatherContrastThreshold: .0500000007 53 | m_FinalGatherGradientThreshold: 0 54 | m_FinalGatherInterpolationPoints: 15 55 | m_AOAmount: 0 56 | m_AOMaxDistance: .100000001 57 | m_AOContrast: 1 58 | m_LODSurfaceMappingDistance: 1 59 | m_Padding: 0 60 | m_TextureCompression: 0 61 | m_LockAtlas: 0 62 | --- !u!196 &5 63 | NavMeshSettings: 64 | m_ObjectHideFlags: 0 65 | m_BuildSettings: 66 | agentRadius: .5 67 | agentHeight: 2 68 | agentSlope: 45 69 | agentClimb: .400000006 70 | ledgeDropHeight: 0 71 | maxJumpAcrossDistance: 0 72 | accuratePlacement: 0 73 | minRegionArea: 2 74 | widthInaccuracy: 16.666666 75 | heightInaccuracy: 10 76 | m_NavMesh: {fileID: 0} 77 | --- !u!1 &559006002 78 | GameObject: 79 | m_ObjectHideFlags: 0 80 | m_PrefabParentObject: {fileID: 0} 81 | m_PrefabInternal: {fileID: 0} 82 | serializedVersion: 4 83 | m_Component: 84 | - 4: {fileID: 559006007} 85 | - 20: {fileID: 559006006} 86 | - 92: {fileID: 559006005} 87 | - 124: {fileID: 559006004} 88 | - 81: {fileID: 559006003} 89 | m_Layer: 0 90 | m_Name: Main Camera 91 | m_TagString: MainCamera 92 | m_Icon: {fileID: 0} 93 | m_NavMeshLayer: 0 94 | m_StaticEditorFlags: 0 95 | m_IsActive: 1 96 | --- !u!81 &559006003 97 | AudioListener: 98 | m_ObjectHideFlags: 0 99 | m_PrefabParentObject: {fileID: 0} 100 | m_PrefabInternal: {fileID: 0} 101 | m_GameObject: {fileID: 559006002} 102 | m_Enabled: 1 103 | --- !u!124 &559006004 104 | Behaviour: 105 | m_ObjectHideFlags: 0 106 | m_PrefabParentObject: {fileID: 0} 107 | m_PrefabInternal: {fileID: 0} 108 | m_GameObject: {fileID: 559006002} 109 | m_Enabled: 1 110 | --- !u!92 &559006005 111 | Behaviour: 112 | m_ObjectHideFlags: 0 113 | m_PrefabParentObject: {fileID: 0} 114 | m_PrefabInternal: {fileID: 0} 115 | m_GameObject: {fileID: 559006002} 116 | m_Enabled: 1 117 | --- !u!20 &559006006 118 | Camera: 119 | m_ObjectHideFlags: 0 120 | m_PrefabParentObject: {fileID: 0} 121 | m_PrefabInternal: {fileID: 0} 122 | m_GameObject: {fileID: 559006002} 123 | m_Enabled: 1 124 | serializedVersion: 2 125 | m_ClearFlags: 1 126 | m_BackGroundColor: {r: .192156866, g: .301960796, b: .474509805, a: .0196078438} 127 | m_NormalizedViewPortRect: 128 | serializedVersion: 2 129 | x: 0 130 | y: 0 131 | width: 1 132 | height: 1 133 | near clip plane: .300000012 134 | far clip plane: 1000 135 | field of view: 60 136 | orthographic: 0 137 | orthographic size: 5 138 | m_Depth: -1 139 | m_CullingMask: 140 | serializedVersion: 2 141 | m_Bits: 4294967295 142 | m_RenderingPath: -1 143 | m_TargetTexture: {fileID: 0} 144 | m_TargetDisplay: 0 145 | m_HDR: 0 146 | m_OcclusionCulling: 1 147 | m_StereoConvergence: 10 148 | m_StereoSeparation: .0219999999 149 | --- !u!4 &559006007 150 | Transform: 151 | m_ObjectHideFlags: 0 152 | m_PrefabParentObject: {fileID: 0} 153 | m_PrefabInternal: {fileID: 0} 154 | m_GameObject: {fileID: 559006002} 155 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 156 | m_LocalPosition: {x: 0, y: .5, z: -5} 157 | m_LocalScale: {x: 1, y: 1, z: 1} 158 | m_Children: [] 159 | m_Father: {fileID: 0} 160 | m_RootOrder: 0 161 | --- !u!1 &1104201777 162 | GameObject: 163 | m_ObjectHideFlags: 0 164 | m_PrefabParentObject: {fileID: 0} 165 | m_PrefabInternal: {fileID: 0} 166 | serializedVersion: 4 167 | m_Component: 168 | - 4: {fileID: 1104201780} 169 | - 33: {fileID: 1104201779} 170 | - 23: {fileID: 1104201778} 171 | m_Layer: 0 172 | m_Name: Stanford Bunny 173 | m_TagString: Untagged 174 | m_Icon: {fileID: 0} 175 | m_NavMeshLayer: 0 176 | m_StaticEditorFlags: 0 177 | m_IsActive: 1 178 | --- !u!23 &1104201778 179 | Renderer: 180 | m_ObjectHideFlags: 0 181 | m_PrefabParentObject: {fileID: 0} 182 | m_PrefabInternal: {fileID: 0} 183 | m_GameObject: {fileID: 1104201777} 184 | m_Enabled: 1 185 | m_CastShadows: 1 186 | m_ReceiveShadows: 1 187 | m_LightmapIndex: 255 188 | m_LightmapTilingOffset: {x: 1, y: 1, z: 0, w: 0} 189 | m_Materials: 190 | - {fileID: 2100000, guid: 17f227f8ff0a2405482f0606dcc3fc9a, type: 2} 191 | m_SubsetIndices: 192 | m_StaticBatchRoot: {fileID: 0} 193 | m_UseLightProbes: 0 194 | m_LightProbeAnchor: {fileID: 0} 195 | m_ScaleInLightmap: 1 196 | m_SortingLayerID: 0 197 | m_SortingOrder: 0 198 | --- !u!33 &1104201779 199 | MeshFilter: 200 | m_ObjectHideFlags: 0 201 | m_PrefabParentObject: {fileID: 0} 202 | m_PrefabInternal: {fileID: 0} 203 | m_GameObject: {fileID: 1104201777} 204 | m_Mesh: {fileID: 4300000, guid: ebf10be2ce31844e4aed5be5de97b27e, type: 2} 205 | --- !u!4 &1104201780 206 | Transform: 207 | m_ObjectHideFlags: 0 208 | m_PrefabParentObject: {fileID: 0} 209 | m_PrefabInternal: {fileID: 0} 210 | m_GameObject: {fileID: 1104201777} 211 | m_LocalRotation: {x: 1.15202326e-07, y: -.707106709, z: -.707106829, w: -1.15202312e-07} 212 | m_LocalPosition: {x: 0, y: 0, z: 0} 213 | m_LocalScale: {x: 1, y: 1, z: 1} 214 | m_Children: [] 215 | m_Father: {fileID: 0} 216 | m_RootOrder: 1 217 | --- !u!1 &1259876720 218 | GameObject: 219 | m_ObjectHideFlags: 0 220 | m_PrefabParentObject: {fileID: 0} 221 | m_PrefabInternal: {fileID: 0} 222 | serializedVersion: 4 223 | m_Component: 224 | - 4: {fileID: 1259876722} 225 | - 108: {fileID: 1259876721} 226 | m_Layer: 0 227 | m_Name: Directional light 228 | m_TagString: Untagged 229 | m_Icon: {fileID: 0} 230 | m_NavMeshLayer: 0 231 | m_StaticEditorFlags: 0 232 | m_IsActive: 1 233 | --- !u!108 &1259876721 234 | Light: 235 | m_ObjectHideFlags: 0 236 | m_PrefabParentObject: {fileID: 0} 237 | m_PrefabInternal: {fileID: 0} 238 | m_GameObject: {fileID: 1259876720} 239 | m_Enabled: 1 240 | serializedVersion: 3 241 | m_Type: 1 242 | m_Color: {r: 1, g: 1, b: 1, a: 1} 243 | m_Intensity: .5 244 | m_Range: 10 245 | m_SpotAngle: 30 246 | m_CookieSize: 10 247 | m_Shadows: 248 | m_Type: 0 249 | m_Resolution: -1 250 | m_Strength: 1 251 | m_Bias: .0500000007 252 | m_Softness: 4 253 | m_SoftnessFade: 1 254 | m_Cookie: {fileID: 0} 255 | m_DrawHalo: 0 256 | m_ActuallyLightmapped: 0 257 | m_Flare: {fileID: 0} 258 | m_RenderMode: 0 259 | m_CullingMask: 260 | serializedVersion: 2 261 | m_Bits: 4294967295 262 | m_Lightmapping: 1 263 | m_ShadowSamples: 1 264 | m_ShadowRadius: 0 265 | m_ShadowAngle: 0 266 | m_IndirectIntensity: 1 267 | m_AreaSize: {x: 1, y: 1} 268 | --- !u!4 &1259876722 269 | Transform: 270 | m_ObjectHideFlags: 0 271 | m_PrefabParentObject: {fileID: 0} 272 | m_PrefabInternal: {fileID: 0} 273 | m_GameObject: {fileID: 1259876720} 274 | m_LocalRotation: {x: .354435891, y: -.493616462, z: .230177253, w: .760089815} 275 | m_LocalPosition: {x: 0, y: 0, z: 0} 276 | m_LocalScale: {x: 1, y: 1, z: 1} 277 | m_Children: [] 278 | m_Father: {fileID: 0} 279 | m_RootOrder: 2 280 | -------------------------------------------------------------------------------- /Assets/Scenes/Sample.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 25c6fd716e80046e58fff5450c377fb9 3 | DefaultImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b0614f5dbc67c439b857b999282bc766 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 39a5d009ca8894dae82780afa17a84de 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor/ObjectFileFormatEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEditor; 3 | using System.IO; 4 | 5 | public class ObjectFileFormatEditor 6 | { 7 | [MenuItem("Assets/OFF/Create Mesh From OFF")] 8 | public static void CreateMeshFromOff() 9 | { 10 | var path = AssetDatabase.GetAssetPath(Selection.activeObject); 11 | var mesh = ObjectFileFormat.OffToMesh(new StreamReader(path)); 12 | var newPath = AssetDatabase.GenerateUniqueAssetPath(Path.ChangeExtension(path, ".asset")); 13 | AssetDatabase.CreateAsset(mesh, newPath); 14 | AssetDatabase.Refresh(); 15 | } 16 | 17 | [MenuItem("Assets/OFF/Create OFF From Mesh")] 18 | public static void CreateOffFromMesh() 19 | { 20 | var mesh = Selection.activeObject as Mesh; 21 | if (mesh == null) { 22 | throw new System.ArgumentException("No mesh selected."); 23 | } 24 | var path = AssetDatabase.GetAssetPath(mesh); 25 | var newPath = AssetDatabase.GenerateUniqueAssetPath(Path.ChangeExtension(path, ".off")); 26 | ObjectFileFormat.MeshToOff(mesh, new StreamWriter(newPath)); 27 | AssetDatabase.Refresh(); 28 | } 29 | 30 | [MenuItem("Assets/OFF/Recalculate Mesh Normals")] 31 | public static void RecalculateNormals() 32 | { 33 | var mesh = Selection.activeObject as Mesh; 34 | if (mesh == null) { 35 | throw new System.ArgumentException("No mesh selected."); 36 | } 37 | mesh.RecalculateNormals(); 38 | EditorUtility.SetDirty(mesh); 39 | AssetDatabase.SaveAssets(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor/ObjectFileFormatEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 18e75ee7cc95d44f386a95c8e1ad2d2f 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/ObjectFileFormat.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using System.Collections.Generic; 7 | 8 | public static class ObjectFileFormat 9 | { 10 | const string PrefixNormal = "N"; 11 | const string PrefixColor = "C"; 12 | const string PrefixTextureCoordinate = "ST"; 13 | const string PrefixNDimension = "n"; 14 | const string PrefixHomogeneousCoordinate = "4"; 15 | 16 | public static Mesh OffToMesh(TextReader off) 17 | { 18 | var mesh = new Mesh(); 19 | var tokens = getTokensOfNonEmptyLines(off); 20 | var parser = parseOff(mesh); 21 | while (parser.MoveNext()) 22 | { 23 | if (tokens.MoveNext()) 24 | parser.Current(tokens.Current); 25 | else 26 | throw new Exception("Parse error."); 27 | } 28 | off.Close(); 29 | mesh.RecalculateBounds(); 30 | return mesh; 31 | } 32 | 33 | public static void MeshToOff(Mesh mesh, TextWriter off) 34 | { 35 | if (mesh.uv.Length != 0) 36 | off.Write(PrefixTextureCoordinate); 37 | if (mesh.colors.Length != 0) 38 | off.Write(PrefixColor); 39 | if (mesh.normals.Length != 0) 40 | off.Write(PrefixNormal); 41 | off.WriteLine("OFF"); 42 | 43 | var verts = mesh.vertices; 44 | var norms = mesh.normals; 45 | var colors = mesh.colors; 46 | var uvs = mesh.uv; 47 | uvs = new Vector2[0]; 48 | colors = new Color[0]; 49 | var tris = mesh.triangles; 50 | var faceCount = tris.Length / 3; 51 | 52 | off.WriteLine(string.Format("{0} {1} {2}", verts.Length, faceCount, 0)); 53 | 54 | for (int i = 0; i < verts.Length; i++) 55 | { 56 | off.Write(verts[i].x); 57 | off.Write(" "); 58 | off.Write(verts[i].y); 59 | off.Write(" "); 60 | off.Write(verts[i].z); 61 | if (norms.Length != 0) 62 | { 63 | off.Write(" "); 64 | off.Write(norms[i].x); 65 | off.Write(" "); 66 | off.Write(norms[i].y); 67 | off.Write(" "); 68 | off.Write(norms[i].z); 69 | } 70 | if (colors.Length != 0) 71 | { 72 | off.Write(" "); 73 | off.Write(colors[i].r); 74 | off.Write(" "); 75 | off.Write(colors[i].g); 76 | off.Write(" "); 77 | off.Write(colors[i].b); 78 | off.Write(" "); 79 | off.Write(colors[i].a); 80 | } 81 | if (uvs.Length != 0) 82 | { 83 | off.Write(" "); 84 | off.Write(uvs[i].x); 85 | off.Write(" "); 86 | off.Write(uvs[i].y); 87 | } 88 | off.WriteLine(); 89 | } 90 | 91 | for(int i = 0; i < faceCount; i++) 92 | { 93 | off.Write("3 "); 94 | off.Write(tris[i * 3]); 95 | off.Write(" "); 96 | off.Write(tris[i * 3 + 1]); 97 | off.Write(" "); 98 | off.WriteLine(tris[i * 3 + 2]); 99 | } 100 | off.Close(); 101 | } 102 | 103 | static IEnumerator getTokensOfNonEmptyLines(TextReader off) 104 | { 105 | var re = new Regex(@"\s+"); 106 | while (off.Peek() > 0) 107 | { 108 | var line = off.ReadLine(); 109 | var sharp = line.IndexOf("#"); 110 | if (sharp >= 0) 111 | { 112 | line = line.Substring(0, sharp); 113 | } 114 | line = line.Trim(" \t\n\r".ToCharArray()); 115 | if (line.Length > 0) yield return re.Split(line); 116 | } 117 | } 118 | 119 | static IEnumerator> parseOff(Mesh mesh) 120 | { 121 | var hasNormal = false; 122 | var hasColor = false; 123 | var hasUv = false; 124 | var hasHomo = false; 125 | var hasDim = false; 126 | var dim = 3; 127 | 128 | var vertexCount = 0; 129 | var faceCount = 0; 130 | 131 | // Parse Header 132 | yield return tokens => 133 | { 134 | if (tokens.Length != 1) 135 | throw new Exception("Invalid OFF header: "); 136 | var re = new Regex("(?ST)?(?C)?(?N)?(?<4>4)?(?n)?OFF"); 137 | var match = re.Match(tokens[0]); 138 | if (!match.Success) 139 | throw new Exception("Invalid OFF header."); 140 | 141 | hasNormal = match.Groups[PrefixNormal].Value == PrefixNormal; 142 | hasColor = match.Groups[PrefixColor].Value == PrefixColor; 143 | hasUv = match.Groups[PrefixTextureCoordinate].Value == PrefixTextureCoordinate; 144 | hasHomo = match.Groups[PrefixHomogeneousCoordinate].Value == PrefixHomogeneousCoordinate; 145 | hasDim = match.Groups[PrefixNDimension].Value == PrefixNDimension; 146 | }; 147 | 148 | // Dimension 149 | if (hasDim) 150 | { 151 | yield return tokens => 152 | { 153 | if (tokens.Length != 1 154 | || !int.TryParse(tokens[0], out dim) 155 | || dim > 3) 156 | { 157 | throw new Exception("Dimension should not be more than 3."); 158 | } 159 | }; 160 | } 161 | 162 | // Counts 163 | yield return tokens => 164 | { 165 | if (!int.TryParse(tokens[0], out vertexCount) 166 | || !int.TryParse(tokens[1], out faceCount)) 167 | throw new Exception("Invalid vertex or face count."); 168 | }; 169 | 170 | // Vertex 171 | var verts = new Vector3[vertexCount]; 172 | var normals = hasNormal ? new Vector3[vertexCount] : null; 173 | var colors = hasColor ? new Color[vertexCount] : null; 174 | var uvs = hasUv ? new Vector2[vertexCount] : null; 175 | var normOff = hasHomo ? dim + 1 : dim; 176 | var colOff = hasNormal ? normOff + dim : normOff; 177 | var uvOff = hasColor ? colOff + 4 : colOff; 178 | int i = 0; 179 | Action parseVert = tokens => 180 | { 181 | var w = 1f; 182 | if ((dim > 0 && !float.TryParse(tokens[0], out verts[i].x)) || 183 | (dim > 1 && !float.TryParse(tokens[1], out verts[i].y)) || 184 | (dim > 2 && !float.TryParse(tokens[2], out verts[i].z)) || 185 | (hasHomo && !float.TryParse(tokens[dim], out w)) || 186 | (hasNormal && !( 187 | float.TryParse(tokens[normOff + 0], out normals[i].x) && 188 | float.TryParse(tokens[normOff + 1], out normals[i].y) && 189 | float.TryParse(tokens[normOff + 2], out normals[i].z))) || 190 | (hasColor && !( 191 | float.TryParse(tokens[colOff + 0], out colors[i].r) && 192 | float.TryParse(tokens[colOff + 1], out colors[i].g) && 193 | float.TryParse(tokens[colOff + 2], out colors[i].b) && 194 | float.TryParse(tokens[colOff + 3], out colors[i].a))) || 195 | (hasUv && !( 196 | float.TryParse(tokens[uvOff + 0], out uvs[i].x) && 197 | float.TryParse(tokens[uvOff + 1], out uvs[i].y)))) 198 | { 199 | throw new Exception("Vertex Parse error: " + i + "."); 200 | } 201 | if (hasHomo) 202 | verts[i] /= w; 203 | }; 204 | for (i = 0; i < vertexCount; i++) 205 | { 206 | yield return parseVert; 207 | } 208 | 209 | // Indexes 210 | var tris = new int[faceCount * 3]; 211 | Action parseFace = tokens => 212 | { 213 | if (tokens[0] != "3" || 214 | !int.TryParse(tokens[1], out tris[i * 3 + 0]) || 215 | !int.TryParse(tokens[2], out tris[i * 3 + 1]) || 216 | !int.TryParse(tokens[3], out tris[i * 3 + 2])) 217 | { 218 | throw new Exception("Face Parse error."); 219 | } 220 | }; 221 | for (i = 0; i < faceCount; i++) 222 | { 223 | yield return parseFace; 224 | } 225 | 226 | mesh.vertices = verts; 227 | mesh.normals = normals; 228 | mesh.colors = colors; 229 | mesh.uv = uvs; 230 | mesh.triangles = tris; 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /Assets/Scripts/ObjectFileFormat.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d968d0a03e94a4a63862e18f90b091bc 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: be9a98ef43cb54e5ca104a6e43e372ae 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Shaders/Transparent_Color_Diffuse.shader: -------------------------------------------------------------------------------- 1 | Shader "Custom/Transparent Color Diffuse" { 2 | Properties { 3 | _Color ("Color", Color) = (1, 1, 1, 1) 4 | } 5 | SubShader { 6 | Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" } 7 | Blend One OneMinusSrcAlpha 8 | CGPROGRAM 9 | #pragma surface surf Lambert 10 | 11 | struct Input { 12 | fixed _; 13 | }; 14 | 15 | fixed4 _Color; 16 | 17 | void surf (Input IN, inout SurfaceOutput o) { 18 | o.Albedo = _Color.rgb * _Color.a; 19 | o.Alpha = _Color.a; 20 | } 21 | ENDCG 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Assets/Shaders/Transparent_Color_Diffuse.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c7d3d0987c8fe40b0a2ced8e196f2da6 3 | ShaderImporter: 4 | defaultTextures: [] 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Textures.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ede3ed1311db74e1e8417808a30e6be1 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/Textures/ScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n-yoda/unity-off/46120043c391fe1e496b0f5a9d7a69f03485249a/Assets/Textures/ScreenShot.png -------------------------------------------------------------------------------- /Assets/Textures/ScreenShot.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 805e968ccbc5246069989d5af061856c 3 | TextureImporter: 4 | fileIDToRecycleName: {} 5 | serializedVersion: 2 6 | mipmaps: 7 | mipMapMode: 0 8 | enableMipMap: 0 9 | linearTexture: 0 10 | correctGamma: 0 11 | fadeOut: 0 12 | borderMipMap: 0 13 | mipMapFadeDistanceStart: 1 14 | mipMapFadeDistanceEnd: 3 15 | bumpmap: 16 | convertToNormalMap: 0 17 | externalNormalMap: 0 18 | heightScale: .25 19 | normalMapFilter: 0 20 | isReadable: 0 21 | grayScaleToAlpha: 0 22 | generateCubemap: 0 23 | seamlessCubemap: 0 24 | textureFormat: -3 25 | maxTextureSize: 1024 26 | textureSettings: 27 | filterMode: -1 28 | aniso: 1 29 | mipBias: -1 30 | wrapMode: 1 31 | nPOTScale: 0 32 | lightmap: 0 33 | compressionQuality: 50 34 | spriteMode: 1 35 | spriteExtrude: 1 36 | spriteMeshType: 1 37 | alignment: 0 38 | spritePivot: {x: .5, y: .5} 39 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 40 | spritePixelsToUnits: 100 41 | alphaIsTransparency: 1 42 | textureType: 8 43 | buildTargetSettings: [] 44 | spriteSheet: 45 | sprites: [] 46 | spritePackingTag: 47 | userData: 48 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | m_SpeedOfSound: 347 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_DSPBufferSize: 0 12 | m_DisableAudio: 0 13 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | m_Gravity: {x: 0, y: -9.81000042, z: 0} 7 | m_DefaultMaterial: {fileID: 0} 8 | m_BounceThreshold: 2 9 | m_SleepVelocity: .150000006 10 | m_SleepAngularVelocity: .140000001 11 | m_MaxAngularVelocity: 7 12 | m_MinPenetrationForPenalty: .00999999978 13 | m_SolverIterationCount: 6 14 | m_RaycastsHitTriggers: 1 15 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 16 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_WebSecurityEmulationEnabled: 0 10 | m_WebSecurityEmulationHostUrl: http://www.mydomain.com/mygame.unity3d 11 | m_DefaultBehaviorMode: 0 12 | m_SpritePackerMode: 0 13 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_AlwaysIncludedShaders: 8 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 9 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 10 | - {fileID: 10782, guid: 0000000000000000f000000000000000, type: 0} 11 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: .00100000005 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: .00100000005 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: .00100000005 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: .00100000005 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left cmd 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: .00100000005 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: .00100000005 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: .100000001 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: .100000001 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: .100000001 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: .189999998 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: .189999998 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: .00100000005 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: .00100000005 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: .00100000005 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: .00100000005 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: .00100000005 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: .00100000005 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: .00100000005 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshLayers.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshLayers: 5 | m_ObjectHideFlags: 0 6 | Built-in Layer 0: 7 | name: Default 8 | cost: 1 9 | editType: 2 10 | Built-in Layer 1: 11 | name: Not Walkable 12 | cost: 1 13 | editType: 0 14 | Built-in Layer 2: 15 | name: Jump 16 | cost: 2 17 | editType: 2 18 | User Layer 0: 19 | name: 20 | cost: 1 21 | editType: 3 22 | User Layer 1: 23 | name: 24 | cost: 1 25 | editType: 3 26 | User Layer 2: 27 | name: 28 | cost: 1 29 | editType: 3 30 | User Layer 3: 31 | name: 32 | cost: 1 33 | editType: 3 34 | User Layer 4: 35 | name: 36 | cost: 1 37 | editType: 3 38 | User Layer 5: 39 | name: 40 | cost: 1 41 | editType: 3 42 | User Layer 6: 43 | name: 44 | cost: 1 45 | editType: 3 46 | User Layer 7: 47 | name: 48 | cost: 1 49 | editType: 3 50 | User Layer 8: 51 | name: 52 | cost: 1 53 | editType: 3 54 | User Layer 9: 55 | name: 56 | cost: 1 57 | editType: 3 58 | User Layer 10: 59 | name: 60 | cost: 1 61 | editType: 3 62 | User Layer 11: 63 | name: 64 | cost: 1 65 | editType: 3 66 | User Layer 12: 67 | name: 68 | cost: 1 69 | editType: 3 70 | User Layer 13: 71 | name: 72 | cost: 1 73 | editType: 3 74 | User Layer 14: 75 | name: 76 | cost: 1 77 | editType: 3 78 | User Layer 15: 79 | name: 80 | cost: 1 81 | editType: 3 82 | User Layer 16: 83 | name: 84 | cost: 1 85 | editType: 3 86 | User Layer 17: 87 | name: 88 | cost: 1 89 | editType: 3 90 | User Layer 18: 91 | name: 92 | cost: 1 93 | editType: 3 94 | User Layer 19: 95 | name: 96 | cost: 1 97 | editType: 3 98 | User Layer 20: 99 | name: 100 | cost: 1 101 | editType: 3 102 | User Layer 21: 103 | name: 104 | cost: 1 105 | editType: 3 106 | User Layer 22: 107 | name: 108 | cost: 1 109 | editType: 3 110 | User Layer 23: 111 | name: 112 | cost: 1 113 | editType: 3 114 | User Layer 24: 115 | name: 116 | cost: 1 117 | editType: 3 118 | User Layer 25: 119 | name: 120 | cost: 1 121 | editType: 3 122 | User Layer 26: 123 | name: 124 | cost: 1 125 | editType: 3 126 | User Layer 27: 127 | name: 128 | cost: 1 129 | editType: 3 130 | User Layer 28: 131 | name: 132 | cost: 1 133 | editType: 3 134 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | m_Gravity: {x: 0, y: -9.81000042} 7 | m_DefaultMaterial: {fileID: 0} 8 | m_VelocityIterations: 8 9 | m_PositionIterations: 3 10 | m_VelocityThreshold: 1 11 | m_MaxLinearCorrection: .200000003 12 | m_MaxAngularCorrection: 8 13 | m_MaxTranslationSpeed: 100 14 | m_MaxRotationSpeed: 360 15 | m_BaumgarteScale: .200000003 16 | m_BaumgarteTimeOfImpactScale: .75 17 | m_TimeToSleep: .5 18 | m_LinearSleepTolerance: .00999999978 19 | m_AngularSleepTolerance: 2 20 | m_RaycastsHitTriggers: 1 21 | m_DeleteStopsCallbacks: 1 22 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 23 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | AndroidProfiler: 0 8 | defaultScreenOrientation: 0 9 | targetDevice: 2 10 | targetGlesGraphics: 1 11 | targetResolution: 0 12 | accelerometerFrequency: 60 13 | companyName: DefaultCompany 14 | productName: unity-off 15 | defaultCursor: {fileID: 0} 16 | cursorHotspot: {x: 0, y: 0} 17 | defaultScreenWidth: 1024 18 | defaultScreenHeight: 768 19 | defaultScreenWidthWeb: 960 20 | defaultScreenHeightWeb: 600 21 | m_RenderingPath: 1 22 | m_MobileRenderingPath: 1 23 | m_ActiveColorSpace: 0 24 | m_MTRendering: 1 25 | m_MobileMTRendering: 0 26 | m_UseDX11: 1 27 | m_Stereoscopic3D: 0 28 | iosShowActivityIndicatorOnLoading: -1 29 | androidShowActivityIndicatorOnLoading: -1 30 | displayResolutionDialog: 1 31 | allowedAutorotateToPortrait: 1 32 | allowedAutorotateToPortraitUpsideDown: 1 33 | allowedAutorotateToLandscapeRight: 1 34 | allowedAutorotateToLandscapeLeft: 1 35 | useOSAutorotation: 1 36 | use32BitDisplayBuffer: 1 37 | use24BitDepthBuffer: 1 38 | defaultIsFullScreen: 1 39 | defaultIsNativeResolution: 1 40 | runInBackground: 0 41 | captureSingleScreen: 0 42 | Override IPod Music: 0 43 | Prepare IOS For Recording: 0 44 | enableHWStatistics: 1 45 | usePlayerLog: 1 46 | stripPhysics: 0 47 | forceSingleInstance: 0 48 | resizableWindow: 0 49 | useMacAppStoreValidation: 0 50 | gpuSkinning: 0 51 | xboxPIXTextureCapture: 0 52 | xboxEnableAvatar: 0 53 | xboxEnableKinect: 0 54 | xboxEnableKinectAutoTracking: 0 55 | xboxEnableFitness: 0 56 | visibleInBackground: 0 57 | macFullscreenMode: 2 58 | d3d9FullscreenMode: 1 59 | d3d11ForceExclusiveMode: 0 60 | xboxSpeechDB: 0 61 | xboxEnableHeadOrientation: 0 62 | xboxEnableGuest: 0 63 | videoMemoryForVertexBuffers: 0 64 | m_SupportedAspectRatios: 65 | 4:3: 1 66 | 5:4: 1 67 | 16:10: 1 68 | 16:9: 1 69 | Others: 1 70 | iPhoneBundleIdentifier: com.Company.ProductName 71 | metroEnableIndependentInputSource: 0 72 | metroEnableLowLatencyPresentationAPI: 0 73 | productGUID: 8ca5a3d6764cd43f2864a272f2c55b94 74 | iPhoneBundleVersion: 1.0 75 | AndroidBundleVersionCode: 1 76 | AndroidMinSdkVersion: 9 77 | AndroidPreferredInstallLocation: 1 78 | aotOptions: 79 | apiCompatibilityLevel: 2 80 | iPhoneStrippingLevel: 0 81 | iPhoneScriptCallOptimization: 0 82 | ForceInternetPermission: 0 83 | ForceSDCardPermission: 0 84 | CreateWallpaper: 0 85 | APKExpansionFiles: 0 86 | StripUnusedMeshComponents: 0 87 | iPhoneSdkVersion: 988 88 | iPhoneTargetOSVersion: 16 89 | uIPrerenderedIcon: 0 90 | uIRequiresPersistentWiFi: 0 91 | uIStatusBarHidden: 1 92 | uIExitOnSuspend: 0 93 | uIStatusBarStyle: 0 94 | iPhoneSplashScreen: {fileID: 0} 95 | iPhoneHighResSplashScreen: {fileID: 0} 96 | iPhoneTallHighResSplashScreen: {fileID: 0} 97 | iPhone47inSplashScreen: {fileID: 0} 98 | iPhone55inPortraitSplashScreen: {fileID: 0} 99 | iPhone55inLandscapeSplashScreen: {fileID: 0} 100 | iPadPortraitSplashScreen: {fileID: 0} 101 | iPadHighResPortraitSplashScreen: {fileID: 0} 102 | iPadLandscapeSplashScreen: {fileID: 0} 103 | iPadHighResLandscapeSplashScreen: {fileID: 0} 104 | AndroidTargetDevice: 0 105 | AndroidSplashScreenScale: 0 106 | AndroidKeystoreName: 107 | AndroidKeyaliasName: 108 | resolutionDialogBanner: {fileID: 0} 109 | m_BuildTargetIcons: [] 110 | m_BuildTargetBatching: [] 111 | webPlayerTemplate: APPLICATION:Default 112 | m_TemplateCustomTags: {} 113 | XboxTitleId: 114 | XboxImageXexPath: 115 | XboxSpaPath: 116 | XboxGenerateSpa: 0 117 | XboxDeployKinectResources: 0 118 | XboxSplashScreen: {fileID: 0} 119 | xboxEnableSpeech: 0 120 | xboxAdditionalTitleMemorySize: 0 121 | xboxDeployKinectHeadOrientation: 0 122 | xboxDeployKinectHeadPosition: 0 123 | ps3TitleConfigPath: 124 | ps3DLCConfigPath: 125 | ps3ThumbnailPath: 126 | ps3BackgroundPath: 127 | ps3SoundPath: 128 | ps3TrophyCommId: 129 | ps3NpCommunicationPassphrase: 130 | ps3TrophyPackagePath: 131 | ps3BootCheckMaxSaveGameSizeKB: 128 132 | ps3TrophyCommSig: 133 | ps3SaveGameSlots: 1 134 | ps3TrialMode: 0 135 | psp2Splashimage: {fileID: 0} 136 | psp2LiveAreaGate: {fileID: 0} 137 | psp2LiveAreaBackround: {fileID: 0} 138 | psp2NPTrophyPackPath: 139 | psp2NPCommsID: 140 | psp2NPCommsPassphrase: 141 | psp2NPCommsSig: 142 | psp2ParamSfxPath: 143 | psp2PackagePassword: 144 | psp2DLCConfigPath: 145 | psp2ThumbnailPath: 146 | psp2BackgroundPath: 147 | psp2SoundPath: 148 | psp2TrophyCommId: 149 | psp2TrophyPackagePath: 150 | psp2PackagedResourcesPath: 151 | flashStrippingLevel: 2 152 | spritePackerPolicy: 153 | scriptingDefineSymbols: {} 154 | metroPackageName: unity-off 155 | metroPackageLogo: 156 | metroPackageLogo140: 157 | metroPackageLogo180: 158 | metroPackageLogo240: 159 | metroPackageVersion: 160 | metroCertificatePath: 161 | metroCertificatePassword: 162 | metroCertificateSubject: 163 | metroCertificateIssuer: 164 | metroCertificateNotAfter: 0000000000000000 165 | metroApplicationDescription: unity-off 166 | metroStoreTileLogo80: 167 | metroStoreTileLogo: 168 | metroStoreTileLogo140: 169 | metroStoreTileLogo180: 170 | metroStoreTileWideLogo80: 171 | metroStoreTileWideLogo: 172 | metroStoreTileWideLogo140: 173 | metroStoreTileWideLogo180: 174 | metroStoreTileSmallLogo80: 175 | metroStoreTileSmallLogo: 176 | metroStoreTileSmallLogo140: 177 | metroStoreTileSmallLogo180: 178 | metroStoreSmallTile80: 179 | metroStoreSmallTile: 180 | metroStoreSmallTile140: 181 | metroStoreSmallTile180: 182 | metroStoreLargeTile80: 183 | metroStoreLargeTile: 184 | metroStoreLargeTile140: 185 | metroStoreLargeTile180: 186 | metroStoreSplashScreenImage: 187 | metroStoreSplashScreenImage140: 188 | metroStoreSplashScreenImage180: 189 | metroPhoneAppIcon: 190 | metroPhoneAppIcon140: 191 | metroPhoneAppIcon240: 192 | metroPhoneSmallTile: 193 | metroPhoneSmallTile140: 194 | metroPhoneSmallTile240: 195 | metroPhoneMediumTile: 196 | metroPhoneMediumTile140: 197 | metroPhoneMediumTile240: 198 | metroPhoneWideTile: 199 | metroPhoneWideTile140: 200 | metroPhoneWideTile240: 201 | metroPhoneSplashScreenImage: 202 | metroPhoneSplashScreenImage140: 203 | metroPhoneSplashScreenImage240: 204 | metroTileShortName: 205 | metroCommandLineArgsFile: 206 | metroTileShowName: 0 207 | metroMediumTileShowName: 0 208 | metroLargeTileShowName: 0 209 | metroWideTileShowName: 0 210 | metroDefaultTileSize: 1 211 | metroTileForegroundText: 1 212 | metroTileBackgroundColor: {r: 0, g: 0, b: 0, a: 1} 213 | metroSplashScreenBackgroundColor: {r: 0, g: 0, b: 0, a: 1} 214 | metroSplashScreenUseBackgroundColor: 0 215 | metroCapabilities: {} 216 | metroUnprocessedPlugins: [] 217 | metroCompilationOverrides: 1 218 | blackberryDeviceAddress: 219 | blackberryDevicePassword: 220 | blackberryTokenPath: 221 | blackberryTokenExires: 222 | blackberryTokenAuthor: 223 | blackberryTokenAuthorId: 224 | blackberryAuthorId: 225 | blackberryCskPassword: 226 | blackberrySaveLogPath: 227 | blackberryAuthorIdOveride: 0 228 | blackberrySharedPermissions: 0 229 | blackberryCameraPermissions: 0 230 | blackberryGPSPermissions: 0 231 | blackberryDeviceIDPermissions: 0 232 | blackberryMicrophonePermissions: 0 233 | blackberryGamepadSupport: 0 234 | blackberryBuildId: 0 235 | blackberryLandscapeSplashScreen: {fileID: 0} 236 | blackberryPortraitSplashScreen: {fileID: 0} 237 | blackberrySquareSplashScreen: {fileID: 0} 238 | tizenProductDescription: 239 | tizenProductURL: 240 | tizenCertificatePath: 241 | tizenCertificatePassword: 242 | tizenGPSPermissions: 0 243 | tizenMicrophonePermissions: 0 244 | stvDeviceAddress: 245 | firstStreamedLevelWithResources: 0 246 | unityRebuildLibraryVersion: 9 247 | unityForwardCompatibleVersion: 39 248 | unityStandardAssetsVersion: 0 249 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 3 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Fastest 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | blendWeights: 1 18 | textureQuality: 1 19 | anisotropicTextures: 0 20 | antiAliasing: 0 21 | softParticles: 0 22 | softVegetation: 0 23 | vSyncCount: 0 24 | lodBias: .300000012 25 | maximumLODLevel: 0 26 | particleRaycastBudget: 4 27 | excludedTargetPlatforms: [] 28 | - serializedVersion: 2 29 | name: Fast 30 | pixelLightCount: 0 31 | shadows: 0 32 | shadowResolution: 0 33 | shadowProjection: 1 34 | shadowCascades: 1 35 | shadowDistance: 20 36 | blendWeights: 2 37 | textureQuality: 0 38 | anisotropicTextures: 0 39 | antiAliasing: 0 40 | softParticles: 0 41 | softVegetation: 0 42 | vSyncCount: 0 43 | lodBias: .400000006 44 | maximumLODLevel: 0 45 | particleRaycastBudget: 16 46 | excludedTargetPlatforms: [] 47 | - serializedVersion: 2 48 | name: Simple 49 | pixelLightCount: 1 50 | shadows: 1 51 | shadowResolution: 0 52 | shadowProjection: 1 53 | shadowCascades: 1 54 | shadowDistance: 20 55 | blendWeights: 2 56 | textureQuality: 0 57 | anisotropicTextures: 1 58 | antiAliasing: 0 59 | softParticles: 0 60 | softVegetation: 0 61 | vSyncCount: 0 62 | lodBias: .699999988 63 | maximumLODLevel: 0 64 | particleRaycastBudget: 64 65 | excludedTargetPlatforms: [] 66 | - serializedVersion: 2 67 | name: Good 68 | pixelLightCount: 2 69 | shadows: 2 70 | shadowResolution: 1 71 | shadowProjection: 1 72 | shadowCascades: 2 73 | shadowDistance: 40 74 | blendWeights: 2 75 | textureQuality: 0 76 | anisotropicTextures: 1 77 | antiAliasing: 0 78 | softParticles: 0 79 | softVegetation: 1 80 | vSyncCount: 1 81 | lodBias: 1 82 | maximumLODLevel: 0 83 | particleRaycastBudget: 256 84 | excludedTargetPlatforms: [] 85 | - serializedVersion: 2 86 | name: Beautiful 87 | pixelLightCount: 3 88 | shadows: 2 89 | shadowResolution: 2 90 | shadowProjection: 1 91 | shadowCascades: 2 92 | shadowDistance: 70 93 | blendWeights: 4 94 | textureQuality: 0 95 | anisotropicTextures: 2 96 | antiAliasing: 2 97 | softParticles: 1 98 | softVegetation: 1 99 | vSyncCount: 1 100 | lodBias: 1.5 101 | maximumLODLevel: 0 102 | particleRaycastBudget: 1024 103 | excludedTargetPlatforms: [] 104 | - serializedVersion: 2 105 | name: Fantastic 106 | pixelLightCount: 4 107 | shadows: 2 108 | shadowResolution: 2 109 | shadowProjection: 1 110 | shadowCascades: 4 111 | shadowDistance: 150 112 | blendWeights: 4 113 | textureQuality: 0 114 | anisotropicTextures: 2 115 | antiAliasing: 2 116 | softParticles: 1 117 | softVegetation: 1 118 | vSyncCount: 1 119 | lodBias: 2 120 | maximumLODLevel: 0 121 | particleRaycastBudget: 4096 122 | excludedTargetPlatforms: [] 123 | m_PerPlatformDefaultQuality: 124 | Android: 2 125 | BlackBerry: 2 126 | FlashPlayer: 3 127 | GLES Emulation: 3 128 | PS3: 3 129 | PS4: 3 130 | PSM: 3 131 | PSP2: 3 132 | Samsung TV: 2 133 | Standalone: 3 134 | Tizen: 2 135 | WP8: 3 136 | Web: 3 137 | Windows Store Apps: 3 138 | XBOX360: 3 139 | XboxOne: 3 140 | iPhone: 2 141 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | tags: 6 | - 7 | Builtin Layer 0: Default 8 | Builtin Layer 1: TransparentFX 9 | Builtin Layer 2: Ignore Raycast 10 | Builtin Layer 3: 11 | Builtin Layer 4: Water 12 | Builtin Layer 5: UI 13 | Builtin Layer 6: 14 | Builtin Layer 7: 15 | User Layer 8: 16 | User Layer 9: 17 | User Layer 10: 18 | User Layer 11: 19 | User Layer 12: 20 | User Layer 13: 21 | User Layer 14: 22 | User Layer 15: 23 | User Layer 16: 24 | User Layer 17: 25 | User Layer 18: 26 | User Layer 19: 27 | User Layer 20: 28 | User Layer 21: 29 | User Layer 22: 30 | User Layer 23: 31 | User Layer 24: 32 | User Layer 25: 33 | User Layer 26: 34 | User Layer 27: 35 | User Layer 28: 36 | User Layer 29: 37 | User Layer 30: 38 | User Layer 31: 39 | m_SortingLayers: 40 | - name: Default 41 | userID: 0 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: .0199999996 7 | Maximum Allowed Timestep: .333333343 8 | m_TimeScale: 1 9 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 n-yoda 2 | 3 | This software is provided 'as-is', without any express or implied 4 | warranty. In no event will the authors be held liable for any damages 5 | arising from the use of this software. 6 | 7 | Permission is granted to anyone to use this software for any purpose, 8 | including commercial applications, and to alter it and redistribute it 9 | freely, subject to the following restrictions: 10 | 11 | 1. The origin of this software must not be misrepresented; you must not 12 | claim that you wrote the original software. If you use this software 13 | in a product, an acknowledgment in the product documentation would be 14 | appreciated but is not required. 15 | 16 | 2. Altered source versions must be plainly marked as such, and must not be 17 | misrepresented as being the original software. 18 | 19 | 3. This notice may not be removed or altered from any source 20 | distribution. 21 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Unity OFF 2 | Import and export OFF (Object File Format) 3D models in Unity3D. 3 | 4 | ![Stanford Bunny](Assets/Textures/ScreenShot.png) 5 | 6 | ## OFF specification 7 | * [Wikipedia - OFF (file format)](http://en.wikipedia.org/wiki/OFF_%28file_format%29) 8 | * [http://www.geomview.org/docs/html/OFF.html](http://www.geomview.org/docs/html/OFF.html) 9 | 10 | ## Example OFF files 11 | Some of well-known models in [The Stanford 3D Scanning Repository](http://graphics.stanford.edu/data/3Dscanrep/) can be downloaded form [here](http://www1.cs.columbia.edu/~cs4162/models/). 12 | 13 | ## Use cases 14 | OFF files can be used in [CGAL (Computational Geometry Algorithms Library)](https://www.cgal.org/). 15 | 16 | * [http://doc.cgal.org/latest/Polyhedron/group__PkgPolyhedronIOFunc.html](http://doc.cgal.org/latest/Polyhedron/group__PkgPolyhedronIOFunc.html) 17 | --------------------------------------------------------------------------------